Ano*_*ser 19 macros cocoa cocoa-touch objective-c
我正在尝试做一些非常简单的事情:一个接受字符串并将其打印到NSLog的宏.
像这样:
#define PRINTTHIS(text) \
NSLog(@"text");
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将字符串传递给这个人时,我最终将"文本"打印到控制台.是不是所有变量都替换在宏内的字符串级别?怎么做对了?
Mic*_*urr 13
您将需要使用预处理器的'stringizing'运算符,#可能还有'token pasting'运算符'##':
#define STRINGIFY2( x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#define PASTE2( a, b) a##b
#define PASTE( a, b) PASTE2( a, b)
#define PRINTTHIS(text) \
NSLog(PASTE( @, STRINGIFY(text)));
Run Code Online (Sandbox Code Playgroud)
我不确定Objective-C是否要求'@'在它和开头引号之间没有空格 - 如果允许空格,则删除PASTE()操作.
请注意,您需要高级2级间接STRINGIFY(),PASTE()以便与宏参数一起正常工作.除非你做一些非常不寻常的事情(你不希望扩展宏参数),否则它几乎不会受到伤害,因此以这种方式使用这些运算符是非常标准的.
这是编写宏的一种方法,它将其参数文本地粘贴到一个字符串对象中,尽管它让我觉得有点粗糙:
#define PRINTTHIS(text) NSLog((NSString *)CFSTR(#text))
Run Code Online (Sandbox Code Playgroud)
它使用字符串化运算符将参数转换为C字符串,然后使用该字符串创建CFString,该字符串与NSString进行免费桥接.
小智 7
看来这也行得通.
#define PRINTTHIS(text) NSLog(@#text);
Run Code Online (Sandbox Code Playgroud)
刚试过它,似乎工作得很好.
小智 5
使用
#define PRINTTHIS(text) \
do { NSLog(@"%s", #text); } while(0)
Run Code Online (Sandbox Code Playgroud)
这样,文本可以包含%字符,它的“if-proof”,分号都在正确的位置,等等......
然而,就我个人而言,我认为直接使用 NSLog() 更有意义。
| 归档时间: |
|
| 查看次数: |
14506 次 |
| 最近记录: |