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 :)