我正在尝试使用宏替换功能。
这是简单的vararg宏定义:
#define FOO(a, ...) printf(a, ##__VA_ARGS__)
所以当我们定义
FOO("1"); //preprocesses to printf("1"), ',' is truncated
FOO("1", 2, 3); //preprocesses to printf("1", 2, 3), ',' is left unchanged
在##
之前没有__VA_ARGS__
的','不会被截断。因此,我希望##运算符可以完成这项工作,但是它在标准中的定义有点模糊。以下是一些引号:
6.10.3.3(p2)
:
如果参数不包含预处理标记,则参数为 替换为地标预处理令牌
6.10.3.3(p3)
:
对于类对象和类函数宏调用,在 重新检查替换列表以获取更多要替换的宏名称,每个 替换列表中
##
预处理令牌的实例(不是来自 参数),并且前面的预处理标记是 与以下预处理令牌连接。
在这2个部分中,我看不出发票FOO("1")
扩展到printf("1")
而不是printf(1,)
的任何原因。 __VA_ARGS__
没有预处理令牌。
因此,如果我们定义
#define FOO(a, b) printf(a, ##b)
为什么FOO(1,)
扩展到printf(1,)
? b
此处也没有预处理令牌。