调用M
不带可变参数的可变参数宏是否合法?
相关的标准报价是[cpp.replace]/4:
如果宏定义中的标识符列表不以省略号结尾,则调用类函数宏时的参数数量(包括那些不包含预处理标记的参数)应等于宏定义中的参数数量。否则,调用中的参数应多于宏定义中的参数(不包括
...
)。应该存在)
终止调用的预处理令牌。
对于没有非可变参数的情况,表单中的调用M()
应该是合法的,因为调用有一个参数(不包含预处理标记)。所以比非可变参数多了一个参数。
对于具有一个非可变参数的情况,是否应该有一个尾随,
以M(1,)
引入一个不包含可变参数的预处理标记的参数?否则,参数的数量将等于非可变参数的数量。IE,
#define variadic(x,...) #__VA_ARGS__
variadic(1,) // 2 arguments: ok
variadic(1) // 1 argument: wrong?
但是, Clang和GCC都接受以下测试用例:
#include <iostream>
#define variadic(x,...) #__VA_ARGS__
int main()
{
std::cout << "'" variadic(1) "'" << std::endl;
}
并产生输出:
''
这是非标准行为吗?