vag*_*ant 26 cocoa cocoa-touch objective-c stringification c-preprocessor
我在构建设置中定义了预处理器宏
FOO=BAR
Run Code Online (Sandbox Code Playgroud)
我希望将这个值按到一个可以传递给方法的Objective-C字符串文字中.以下#define不起作用,但它应该展示我想要实现的目标:
#define FOOLITERAL @"FOO" //want FOOLITERAL to have the value of @"BAR"
myMethodThatTakesAnNSString(FOOLITERAL);
Run Code Online (Sandbox Code Playgroud)
我希望我只是在某种程度上错过了显而易见的东西,但我似乎无法找到合适的预处理器伏都教来获得我需要的东西.
Ada*_*eld 35
使用stringizing运算符 #从符号中生成一个C字符串.但是,由于预处理器的怪癖,您需要使用两个额外的宏层:
#define FOO BAR
#define STRINGIZE(x) #x
#define STRINGIZE2(x) STRINGIZE(x)
#define FOOLITERAL @ STRINGIZE2(FOO)
// FOOLITERAL now expands to @"BAR"
Run Code Online (Sandbox Code Playgroud)
额外图层的原因是字符串化运算符只能用于宏的参数,而不能用于其他标记.其次,如果宏的参数在宏的主体中应用了字符串化运算符,则该参数不会扩展为另一个宏.因此,为了确保FOO扩展,我们将换行另一个宏,以便在STRINGIZE2扩展时,它也会扩展,FOO因为字符串化运算符不会出现在该宏的主体中.
pau*_*kow 28
这是Adam Rosenfield的答案的修改版本,具有更清晰的语义:
#define NSStringize_helper(x) #x
#define NSStringize(x) @NSStringize_helper(x)
Run Code Online (Sandbox Code Playgroud)
我用它来代替这样的代码:
case OneEnumValue: name = @"OneEnumValue"; break;
case AnotherEnumValue: name = @"AnotherEnumValue"; break;
Run Code Online (Sandbox Code Playgroud)
有了这个:
#define case_for_type(type) case type: name = NSStringize(type); break
case_for_type(OneEnumValue);
case_for_type(AnotherEnumValue);
Run Code Online (Sandbox Code Playgroud)