2
#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)]);

那是行不通的。我想知道为什么。

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

4

1 回答 1

7

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

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

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

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

将扩展到;

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

这表明该a参数仅包含直到第一个未引用的逗号的所有字符。

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

于 2013-01-01T07:48:54.290 回答