Доступ к значению определения макроса препроцессора

Если я добавлю макрос «FOO=bar» в GCC_PREPROCESSOR_DEFINITIONS (или макросы препроцессора, если вы используете XCode), каким будет лучший способ получить доступ к значению «FOO»?

В настоящее время я использую неуклюжий:

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

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

Это выведет «бар»

Конечно, должен быть лучший/более чистый способ?


person Adriaan Tijsseling    schedule 16.07.2010    source источник


Ответы (2)


То, что вы делаете, — это способ строчить (или строчить) значения макроса. Косвенность неизбежна.

Это упоминается в препроцессоре GCC раздел руководства (ссылка в архиве), на который ссылается Роб:

 #define xstr(s) str(s)
 #define str(s) #s
 #define foo 4
 str (foo)
      ==> "foo"
 xstr (foo)
      ==> xstr (4)
      ==> str (4)
      ==> "4
person Georg Fritzsche    schedule 16.07.2010

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

См. раздел сведение строк. Это техника, которую вы уже используете. Что с ним не так?

person Rob Napier    schedule 16.07.2010
comment
Это приведет к NSLog(@"%s", #bar); после предварительной обработки - косвенное обращение через другой макрос необходимо для расширения макроса. - person Georg Fritzsche; 16.07.2010
comment
Это означает, что вы не можете превратить строковый макрос препроцессора в константу NSString, верно? (Потому что, как только вы выполните [NSString stringWithFormat:macroString], он перестанет быть константным инициализатором.) - person zekel; 21.04.2011
comment
Один из моих проектов превратил строковые макросы препроцессора в константу NSString, например: #define kString String #define kNSString @kString - person Rob Napier; 22.04.2011