Seite 1 von 1

Makros und String Concatenation

Verfasst: 02.11.2011, 13:31
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__)
?

Re: Makros und String Concatenation

Verfasst: 02.11.2011, 14:33
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

Re: Makros und String Concatenation

Verfasst: 02.11.2011, 14:43
von kaiserludi
Danke :)