Preprocessor macro value to Objective-C string literal

 ̄綄美尐妖づ 提交于 2020-12-27 08:38:30

问题


I have a preprocessor macro defined in build settings

FOO=BAR

That value I want to massage into an Objective-C string literal that can be passed to a method. The following #define does not work, but it should demonstrate what I am trying to achieve:

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

 myMethodThatTakesAnNSString(FOOLITERAL);

I expect that I am just missing the obvious somehow, but I cannot seem to find the right preprocessor voodoo to get what I need.


回答1:


Use the stringizing operator # to make a C string out of the symbol. However, due to a quirk of the preprocessor, you need to use two extra layers of macros:

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

The reason for the extra layers is that the stringizing operator can only be used on the arguments of the macro, not on other tokens. Secondly, if an argument of a macro has the stringizing operator applied to it in the body of the macro, then that argument is not expanded as another macro. So, to ensure that FOO gets expanded, we wrap in another macro, so that when STRINGIZE2 gets expanded, it also expands FOO because the stringizing operator does not appear in that macro's body.




回答2:


Here's a modified version of Adam Rosenfield's answer with clearer semantics:

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

I use it to replace code like this:

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

with this:

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

case_for_type(OneEnumValue);
case_for_type(AnotherEnumValue);



回答3:


You need to define preprocessor macro like,

FOO=\@\"BAR\"

And use code side like,

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



回答4:


What error are you seeing exactly? This type of thing does work as you expect:

#define kMyString @"MyString"

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


来源:https://stackoverflow.com/questions/7605857/preprocessor-macro-value-to-objective-c-string-literal

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!