我可以将#define加载到NSString中吗?

时间:2012-07-19 00:05:07

标签: objective-c

  

可能重复:
  C Preprocessor, Stringify the result of a macro

我有这个定义:

#define VERSION 0.3.2

我想将其转换为@"0.3.2"(NSString) - 这可能吗?假设我不允许在#define中添加引号。

这样的事情,但可能还有一个额外的步骤:

NSString *myVersion = [NSString stringWith???:VERSION];

2 个答案:

答案 0 :(得分:2)

正如在我链接的可能的dup中,你需要两个更多级别的宏,因为你想要对宏扩展进行字符串化:

#define VERSION 0.3.2
#define StringifyWithoutExpandingMacros(x) #x
#define Stringify(x) StringifyWithoutExpandingMacros(x)

NSLog(@"VERSION = %@", @StringifyWithoutExpandingMacros(VERSION));
// output: VERSION = VERSION

NSLog(@"VERSION = %@", @Stringify(VERSION));
// output: VERSION = 0.3.2

请注意,您只需在宏调用前粘贴@即可。它不需要在宏内。如果你愿意,可以把它放在宏中:

#define NSStringifyWithoutExpandingMacros(x) @#x
#define NSStringify(x) NSStringifyWithoutExpandingMacros(x)

NSLog(@"VERSION = %@", NSStringify(VERSION));
// output: VERSION = 0.3.2

答案 1 :(得分:1)

Stringify

#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define AT __FILE__ ":" TOSTRING(__LINE__)

@ HotLick的宏观魔力是最好的。