6

我正在尝试创建一个宏定义,该定义可以根据上下文发出 C++ 或 Objective-C,但似乎无法在宏内轻松构造 NSString。C++ 版本很简单,因为它使用常规字符串,但制作一个发出 NSString 的字符串被证明是棘手的:

#define FOO(x) bar(@##x)

预期的结果是通过前缀将字符串参数转换为 NSString 参数@

FOO("x")
// => bar(@"x")

我得到的是一个阻止编译的错误:

Pasting formed '@"x"', an invalid preprocessing token
4

3 回答 3

5
NSString *x = @"text";

等于:

NSString *x = CFSTR("text");

PS NSString* 和 CFStringRef 和 __CFString* 以及 NSCFStringRef 都是一样的:免费桥接类型

于 2012-06-06T19:48:24.677 回答
3

##除非它们一起形成有效的预处理标记,否则您不能用于连接元素,但您可以调用NSString采用 C 字符串的构造函数,如下所示:

#define FOO(x) [NSString stringWithUTF8String:(x)]
于 2012-06-06T19:56:35.720 回答
3

嗯,为什么不这样:

#define FOO(x) bar(@x)

?

无需进行令牌粘贴或字符串化或任何奇怪的事情。您只希望替换点的参数列表中的内容前面有一个 @ 符号。所以就这样做吧。

于 2012-06-06T20:32:00.187 回答