请考虑以下代码(live example):
#define TEST_VA(mX, ...) TEST
#define STRINGIFY_IMPL(mX) #mX
#define STRINGIFY(mX) STRINGIFY_IMPL(mX)
#include <iostream>
int main()
{
std::cout << STRINGIFY(TEST_VA(1)) << std::endl;
std::cout << STRINGIFY(TEST_VA()) << std::endl;
return 0;
}
clang ++ 3.4 抱怨:
main.cpp:9:37: warning: must specify at least one argument for '...' parameter of variadic macro [-Wgnu-zero-variadic-macro-arguments]
std::cout << STRINGIFY(TEST_VA(1)) << std::endl;
^
main.cpp:1:9: note: macro 'TEST_VA' defined here
#define TEST_VA(mX, ...) TEST
^
main.cpp:10:33: warning: must specify at least one argument for '...' parameter of variadic macro [-Wgnu-zero-variadic-macro-arguments]
std::cout << STRINGIFY(TEST_VA()) << std::endl;
^
main.cpp:1:9: note: macro 'TEST_VA' defined here
#define TEST_VA(mX, ...) TEST
我在项目的示例代码中使用了一些可变参数宏。
为variadic宏的...
参数传递参数是否安全? (基本上忽略警告)
或者它可能导致问题?
标准是否明确禁止?
答案 0 :(得分:1)
这在标准上是技术上禁止的。从C ++11§16.3/ 4(重点补充):
如果宏定义中的标识符列表没有以省略号结尾,则参数的数量(包括 在调用类函数宏时,那些由没有预处理标记组成的参数应该相等 宏定义中的参数数量。 否则,调用中的参数应该多于宏定义中的参数(
...
除外)。应存在)
预处理 终止调用的令牌。
某些编译器可能允许将其作为扩展,但如果您需要符合标准的代码,则应确保始终为可变参数宏的省略号参数包含至少一个参数。