2010-07-16 36 views
14

Si agrego una macro "FOO = bar" bajo GCC_PREPROCESSOR_DEFINITIONS (o Macros de preprocesador si usa XCode "), ¿cuál sería la mejor manera de acceder al valor de" FOO "?Accediendo al valor de una definición de macro del preprocesador

la actualidad, utilizo el torpe:

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

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

Esta es la salida "barra"

Seguramente, debe haber una manera mejor/más limpio

Respuesta

10

Lo que está haciendo es el camino a stringize (o stringify) Los valores de macro. La indirección es inevitable.

Esto incluso se menciona en el preprocesador GCC manual section al que Rob vinculó.

+0

Gracias por la confirmación. – Adriaan

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

Ver Stringification. Es la técnica que ya estás usando. ¿Qué estuvo mal con eso?

+1

Esto daría como resultado 'NSLog (@"% s ", #bar);' después del preprocesamiento: la indirección a través de otra macro es necesaria para permitir la expansión de macros. –

+0

Tomó nota y estuvo de acuerdo. –

+0

Significa que no puede convertir una macro de cadena de preprocesador en una constante NSString ¿verdad? (Porque tan pronto como lo haga [NSString stringWithFormat: macroString] deja de ser un inicializador constante.) – zekel

Cuestiones relacionadas