2010-07-16 12 views
14

Wenn ich ein Makro "FOO = bar" unter GCC_PREPROCESSOR_DEFINITIONS (oder Präprozessormakros, wenn Sie XCode verwenden) hinzufügen, was wäre der beste Weg, um auf den Wert von "FOO" zuzugreifen?Auf den Wert einer Präprozessor-Makrodefinition zugreifen

Derzeit verwende ich die ungeschickte:

#define MACRO_NAME(f) #f 
    #define MACRO_VALUE(f) MACRO_NAME(f) 

    #ifdef FOO 
     NSLog(@"%s", MACRO_VALUE(FOO)); 
    #else 
     NSLog(@"undefined"); 
    #endif 

Dies wird Ausgang "bar"

Sicher, es muss ein besserer/sauberere Weg

Antwort

10

Was Sie tun, ist die Art und Weise -stringize (oder stringify) Makrowerte. Die Indirektion ist unvermeidlich.

Dies wird sogar im GCC-Präprozessor manual section erwähnt, mit dem Rob verbunden war.

+0

Danke für die Bestätigung. – Adriaan

2
NSLog(@"%s", #FOO); 
?

Siehe Stringification. Es ist die Technik, die Sie bereits verwenden. Was war daran falsch?

+1

Dies würde zu 'NSLog (@"% s ", #bar) führen;' nach der Vorverarbeitung ist die Indirektion durch ein anderes Makro erforderlich, um eine Makroexpansion zu ermöglichen. –

+0

Bekannt und zugestimmt. –

+0

Es bedeutet, dass Sie ein Präprozessor-String-Makro nicht in eine NSString-Konstante verwandeln können, oder? (Sobald Sie [NSString stringWithFormat: macroString] tun, hört es auf, ein konstanter Initialisierer zu sein.) – zekel

Verwandte Themen