Makros und String Concatenation

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Makros und String Concatenation

Beitrag von kaiserludi »

Moin.
Wieso funktioniert zwar folgendes:

Code: Alles auswählen

#define WIDEN2(str) (L ## str)
#define WIDEN(str) WIDEN2(str)
#define __FILEW__ WIDEN(__FILE__)
Aber nicht folgendes:

Code: Alles auswählen

#define WIDEN(str) (L ## str)
#define __FILEW__ WIDEN(__FILE__)
?
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Re: Makros und String Concatenation

Beitrag von BeRsErKeR »

Macro-Argumente werden nur dann vollständig expandiert, wenn es sich nicht um eine Konkatenation (##) oder Umwandlung in einen String (#) handelt. Das wäre auch ziemlich schlecht, weil sonst sowas nicht gehen würde:

Code: Alles auswählen

#define STR(x) #x
#define CONCAT(x, y) x ## y

const char foo[] = STR(Test);
conct char bar[] = CONCAT(foo, bar);
Wie gesagt bei allen anderen Fällen wird zunächst expandiert und ersetzt. Im Anschluss werden nochmal alle gefundenen Makros im Makro-Body substituiert.

In deinem Fall würde WIDEN das Argument str vor dem Aufruf von WIDEN2 expandieren und substituieren, sodass WIDEN2 mit dem konkreten Wert von __FILE__ aufgerufen wird. Das Argument wird also vor der Konkatenation substituiert.

Hier noch ein nützlicher Link zum Thema: http://gcc.gnu.org/onlinedocs/cpp/Argum ... nt-Prescan
Ohne Input kein Output.
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Re: Makros und String Concatenation

Beitrag von kaiserludi »

Danke :)
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
Antworten