可能重复:
C 预处理器,将宏的结果字符串化
我有这个定义:
#define VERSION 0.3.2
我想把它转换成@"0.3.2"
(一个 NSString)——这可能吗?假设我不允许在#define 中添加引号。
像这样的东西,但大概有一个额外的步骤:
NSString *myVersion = [NSString stringWith???:VERSION];
可能重复:
C 预处理器,将宏的结果字符串化
我有这个定义:
#define VERSION 0.3.2
我想把它转换成@"0.3.2"
(一个 NSString)——这可能吗?假设我不允许在#define 中添加引号。
像这样的东西,但大概有一个额外的步骤:
NSString *myVersion = [NSString stringWith???:VERSION];
正如我链接的可能的 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
字符串化!
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define AT __FILE__ ":" TOSTRING(__LINE__)
@HotLick 的宏魔法是最好的。