代码不起作用,但等效代码有效

时间:2013-01-01 07:38:35

标签: objective-c

#define CLog( s, ... ) NSLog( @"%@", [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#define PO(x) CLog(@#x ": %@", x)

然后我这样做:

 NSString * hello =[NSString stringWithFormat:@"%@, %@",theCatalogData.id,@(theCatalogData.images.count)];
    PO(hello);

作品

当然,缩短版本只是:

PO([NSString stringWithFormat:@"%@, %@",theCatalogData.id,@(theCatalogData.images.count)]);

这不起作用。我想知道为什么。

没有紧急情况。没问题。无论如何,等效的时间更长。我只是想了解编译器如何解析宏以查看为什么事情不起作用。

1 个答案:

答案 0 :(得分:7)

由于预处理器本身并不真正理解语法,因此包含逗号的宏参数将导致问题。

在第二种情况下,由于参数在引号之外包含两个逗号,编译器认为宏得到3个参数而不是一个,并且由于宏只接受一个参数,编译器会抱怨。

与第二种情况类似的简化测试用例;

#define TEST(a,b,c) a
TEST([d e:@"%@, %@", f, g])

将扩展为;

[d e:@"%@, %@"

表示a参数仅包含第一个未引用逗号的所有字符。

在您的情况下,您定义TEST宏以获取一个参数,并且由于预处理器将其视为3,因此编译将失败。