宏功能的宏替换

时间:2019-01-12 08:46:40

标签: c macros preprocessor

我正在尝试使用宏替换功能。

LIVE EXAMPLE

这是简单的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此处也没有预处理令牌。

0 个答案:

没有答案