23

tengo una macro preprocesador se define en la configuración de generaciónpreprocesador valor de la macro a la cadena de Objective-C literal

FOO=BAR 

Ese valor Quiero dar masajes en una cadena literal Objective-C que se puede pasar a un método. La siguiente #define no funciona, pero debe demostrar lo que estoy tratando de lograr:

#define FOOLITERAL @"FOO" //want FOOLITERAL to have the value of @"BAR" 

myMethodThatTakesAnNSString(FOOLITERAL); 

espero que sólo estoy perdiendo lo obvio de alguna manera, pero me parece que no puede encontrar el vudú preprocesador derecho a conseguir lo Necesito.

Respuesta

32

Uso del operador stringizing# para hacer una cadena C a partir del símbolo. Sin embargo, debido a una peculiaridad del preprocesador, es necesario utilizar dos capas adicionales de macros:

#define FOO BAR 
#define STRINGIZE(x) #x 
#define STRINGIZE2(x) STRINGIZE(x) 
#define FOOLITERAL @ STRINGIZE2(FOO) 
// FOOLITERAL now expands to @"BAR" 

La razón de las capas adicionales es que el operador stringizing sólo se puede utilizar en los argumentos de la macro, no se en otros tokens En segundo lugar, si un argumento de una macro tiene el operador de stringing aplicado en el cuerpo de la macro, entonces ese argumento es no expandido como otra macro. Por lo tanto, para asegurarnos de que FOO se expanda, incluimos otra macro, de modo que cuando STRINGIZE2 se expanda, también se expande FOO porque el operador de stringing no aparece en el cuerpo de esa macro.

+0

Eso lo hizo. Probé la indirección doble, pero también tenía el valor "@" como macro y eso parece confundirlo. Una pequeña diferencia es que la primera línea no representa mi caso en el que no recupera la configuración de acumulación #define FOO FOOVAL #define STRINGIZE (x) #x #define STRINGIZE2 (x) STRINGIZE (x) #define FOOLITERAL @ STRINGIZE2 (FOOVAL) es lo que realmente funciona para mí. Pero tu respuesta me llevó allí. – vagrant

+0

Hola @vagrant. ¿Esta solución aún funciona para usted con LLVM? Estoy tratando de hacer que esto funcione, pero el valor real de FOO como se define en mis macros de preprocesador de configuración de compilación nunca aparece. ¿Podría actualizar su pregunta con la solución que más le convenga?Aclamaciones. – epologee

+1

¿Por qué no simplemente '#define Helper (STR) @ # STR'? – tadeuzagallo

-1

¿Qué error está viendo exactamente? Este tipo de cosas no funcionan como se espera:

#define kMyString @"MyString" 

[NSString stringWithFormat:@"macro: %@", kMyString]; 
+3

El valor real de la cadena necesita es el valor de la macro preprocesador. Así que no puedo simplemente poner el valor en el código como en su ejemplo, tiene que venir de la variable FOO. – vagrant

26

Aquí es una versión modificada de la respuesta de Adam Rosenfield con la semántica más claras:

#define NSStringize_helper(x) #x 
#define NSStringize(x) @NSStringize_helper(x) 

lo uso para reemplazar código como este:

case OneEnumValue: name = @"OneEnumValue"; break; 
case AnotherEnumValue: name = @"AnotherEnumValue"; break; 

con esto:

#define case_for_type(type) case type: name = NSStringize(type); break 

case_for_type(OneEnumValue); 
case_for_type(AnotherEnumValue); 
1

Usted necesita definir macro de preprocesador como,

FOO=\@\"BAR\" 

Y el uso lado de código como,

[NSString stringWithFormat:@"macro: %@", FOO]; 
Cuestiones relacionadas