amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Zeichenketten beim Compileaufruf definieren [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

31.08.2005, 03:19 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Wie kann ich eine Zeichenkette definieren beim Compileraufruf des gcc, wenn ich
code:
gcc ... -DDATETXT="20.08.2004" ...


mache kann ich das nicht benutzen, irgendwie fehlen dann die Anführungszeichen, welche bei direkter definition im Code vorhanden sind.

Das Problem ist, ich möchte über eine Library module erstellen, und die Headerdateien unangetastet lassen, d.h. die zu ändernden Strings nur über das Makefile ändern, bekomme es aber nicht hin.

Ggf würde es helfen ein Anführungszeichen im Header hinzuzufügen, aber wie?

[ Dieser Beitrag wurde von DariusBrewka am 31.08.2005 um 03:20 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

31.08.2005, 06:31 Uhr

Solar
Posts: 3680
Nutzer
-DDATETXT=""20.08.2004""

[ - Antworten - Zitieren - Direktlink - ]

31.08.2005, 10:21 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Kann mir jemand sagen warum ich auf diese Idee nicht gekommen bin, habe das mit dem Anführungszeichen ausprobiert, es aber beim Compileraufruf so zu machen, darauf bin ich nicht gekommen.

Danke!

[ - Antworten - Zitieren - Direktlink - ]

31.08.2005, 13:42 Uhr

Dietmar
Posts: 166
Nutzer
@DariusBrewka:
Zitat:
Kann mir jemand sagen warum ich auf diese Idee nicht gekommen bin, habe das mit dem Anführungszeichen ausprobiert
Weil es nicht immer funktioniert? SAS/C stolpert über den Escape-Character. Allerdings nur bei Aufruf über Makefile (keine Ahnung, woran es jetzt liegt): sc DEFINE TEST=""test"" usw. führt zu einem Illegal Character-Fehler. Meine Abhilfe ist der Quotify-Operator des Preprozessors (#).

[ Dieser Beitrag wurde von Dietmar am 31.08.2005 um 13:42 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

31.08.2005, 13:52 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von Dietmar:

SAS/C stolpert über den Escape-Character. Allerdings nur bei Aufruf über Makefile (keine Ahnung, woran es jetzt liegt)...


Interpretation der Kommandozeile ist Sache der Shell... evtl. kann SAS/C mit den Anführungszeichen zwar sehr wohl umgehen, nur die von 'make' benutzte Shell nicht? (/bin/sh per Default bzw. $SHELL...)

[ - Antworten - Zitieren - Direktlink - ]

31.08.2005, 23:55 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Auf jeden Fall hat das so wie von Solar beschrieben funktioniert, gib's ggf. irgendwo eine Beschreibung für den Präprozessor (gcc), z.B. schleifen etc.

[ - Antworten - Zitieren - Direktlink - ]

01.09.2005, 09:04 Uhr

gni
Posts: 1106
Nutzer
Zitat:
DariusBrewka:
Auf jeden Fall hat das so wie von Solar beschrieben funktioniert,

Wie man zu qouten hat, liegt an der verwendeten Shell.
Zitat:
gib's ggf. irgendwo eine Beschreibung für den Präprozessor (gcc), z.B. schleifen etc.
Schleifen? Die Doku für CPP ist in cpp.info bzw. cpp.guide.

[ Dieser Beitrag wurde von gni am 01.09.2005 um 13:16 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

01.09.2005, 09:14 Uhr

Solar
Posts: 3680
Nutzer
Der Präprozessor ist ein eigenständiges Programm ("cpp"), mit seiner eigenen Doku.

Falls Dir .info und .guide zu unhandlich sind, gibt's auch noch http://gcc.gnu.org/onlinedocs/.

[ - Antworten - Zitieren - Direktlink - ]

01.09.2005, 10:33 Uhr

Holger
Posts: 8116
Nutzer
So löblich das Lesen einer Anleitung auch ist:
Der Präprozessor hilft einem am Meisten, wenn man ihn möglichst wenig und mit möglichst einfachen Konstrukten benutzt.
Schon der Gedanke, daß da jemand über Schleifen im Präprozessor nachdenkt, brrr

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

01.09.2005, 10:54 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Was ist an schleifen so schlimm, z.B. könnte es Nützlich sein eine Tabelle zu füllen ohne dafür Extra code zu erstellen etc., in meinem Fall, z.B. bei der Libraryerstellung muss ich für vieles Funktionshaeder& Co definieren, da müssen Deklarationen, Header und die eigentlichen Funktionsaufrufe (d.h. die Functab erstellt werden), ich fänd's z.B. das in einem Rutsch zu machen, als ähnliches immer wieder zu schreiben.

unteres Beispiel nicht als nützlich ansehen,:

code:
//deklaration
void Test1();
void Test2();
void Test3();

//definition
void Test1() {
....
}
void Test2() {
....
}
void Test3() {
....
}

Functable:
 (APTR) Init,
 (APTR) Expuge,
 ...
 ...
 ...
 (APTR) Test1,
 (APTR) Test2,
 (APTR) Test3,
 NULL,


ich fänd's z.B schön wenn man es einfach so machen könnte:

code:
DEF_FUNC(Test1) {}
 DEF_FUNC(Test2) {}
 DEF_FUNC(Test3) {}

FuncTable:
 ...
 FOR(i=1; i < NUM_FUNC, I++) {
  (APTR) FUNC_NAME(i)
 }


sieht zwar Merkwürdig aus und wird wohl auch nicht gehen, aber eine Erleichterung wär's schon.

[ - Antworten - Zitieren - Direktlink - ]

01.09.2005, 11:15 Uhr

Solar
Posts: 3680
Nutzer
Wenn man davon absieht, das eine Deklaration in den Header und die Definition in eine .c-Datei gehört, bzw. die Deklaration sich erübrigt wenn Du direkt danach ohnehin die Definition schreibst...

Präprozessor-"Magie" ist eine sehr gute Methode, sich in's Bein zu schießen und die Ambulanz nach Mexiko zu schicken. Wo nicht unbedingt notwendig, lassen.

Ich hab' mal zwei Tage nach der Deklaration einer Klasse "RReply" gesucht, weil es die Klasse gar nicht gab sondern per Makro eine shared reference aus "Reply" gebildet wurde...

Für den Hausgebrauch erschöpft sich die Nützlichkeit von Makros in include, ifndef NDEBUG und dem zentralen define von "magic numbers". Alles andere ist für Profis und Masochisten. ;)

[ Dieser Beitrag wurde von Solar am 01.09.2005 um 11:16 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

01.09.2005, 12:02 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von DariusBrewka:
ich fänd's z.B schön wenn man es einfach so machen könnte:

code:
DEF_FUNC(Test1) {}
 DEF_FUNC(Test2) {}
 DEF_FUNC(Test3) {}

FuncTable:
 ...
 FOR(i=1; i < NUM_FUNC, I++) {
  (APTR) FUNC_NAME(i)
 }


sieht zwar Merkwürdig aus und wird wohl auch nicht gehen, aber eine Erleichterung wär's schon.


Das zeigt, wie sehr das Verkomplizieren von Konstrukten zu Denkfehlern führen kann. In Deinem Beispiel definierst Du eine Handvoll Funktionen. Aber woher weiß denn die Schleife, über welche Funktionen sie iterieren soll?
Dazu müßtest Du eine Tabelle anlegen, in der die betroffenen Funktionen aufgelistet sind -> schwupps hast Du exakt das gemacht, was Du ja eigentlich einsparen wolltest, eine Tabelle anlegen.

Dabei ist es doch so einfach. Du mußt sowieso jede Funktion deklarieren. Also bastelst Du Dir ein Makro, daß bereits bei der ersten Deklaration den Eintrag in der Funktionstabelle erzeugt. Damit mußt Du die Deklarationen kein zweites Mal anfassen und brauchst auch keine Schleife.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

01.09.2005, 12:10 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Ist ja auch schon Richtig, es war auch nicht meine Intention definitionen und deklarationen in die falschen Files zu packen, sondern dass die Header files die Funktionen deklarierten und mit dieser Deklaration im *.c file Automatisch eine Definition einer Funktion erstellt wird. Hört sich ggf. komisch an, aber ich mag diese ganzen Registeraufrufe & Co nicht, d.h. was ich genauer wollte ist das durch die Deklaration einer Funktion, z.B.

code:
AROS_LD2(APTR, NewTool,
         AROS_LDA(APTR, pf, A0),
         AROS_LDA(APTR, pool, A1),
         struct AmiStartBaseP *, AmiStartBase, 8, AmiStart);


erstens die Funktion deklariert wird (im *.h File)

und dadurch gleichzeitig im *.c File eine Funktion

code:
AROS_LH2(APTR, NewTool,
         AROS_LHA(APTR, pf, A0),
         AROS_LHA(APTR, pool, A1),
         struct AmiStartBaseP *, AmiStartBase, 8, AmiStart)
{
    AROS_LIBFUNC_INIT
    AROS_LIBBASE_EXT_DECL(struct AmiStartBaseP *,AmiStartBase)
        
			/* library function code */
    return (APTR) _NewTool(pf, pool, AmiStartBase);
    
    AROS_LIBFUNC_EXIT
}


erstellt wird, die halt eine Funktion _FunktionsName() aufruft, wo der ganze Registerkrempel oben entfällt und IMHO dadurch leserlicher wird.

Das das nicht geht, daran habe ich keine Zweifel, aber schön wärs für mich schon, da der Code so leserlicher wird und man nicht Teile die ähnlich sind mehrmals schreiben muss.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Zeichenketten beim Compileaufruf definieren [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.