C++ “gnu零变量宏参数”可以安全忽略吗?

C++ “gnu零变量宏参数”可以安全忽略吗?,c++,c++11,warnings,c-preprocessor,variadic-macros,C++,C++11,Warnings,C Preprocessor,Variadic Macros,考虑以下代码: #定义测试(mX,…)测试 #定义STRINGIFY_IMPL(mX)#mX #定义字符串化(mX)字符串化(mX) #包括 int main() { std::cout该标准在技术上是禁止的。从C++11§16.3/4(重点添加): 如果宏定义中的标识符列表未以省略号结尾,则参数数(包括 在调用函数(如宏)时,不包含预处理标记的参数应相等 宏定义中的参数数。否则,调用中的参数应多于宏定义中的参数(不包括…)。应存在)预处理 终止调用的令牌 某些编译器可能允许将其作为扩展,但如果

考虑以下代码:

#定义测试(mX,…)测试
#定义STRINGIFY_IMPL(mX)#mX
#定义字符串化(mX)字符串化(mX)
#包括
int main()
{

std::cout该标准在技术上是禁止的。从C++11§16.3/4(重点添加):

如果宏定义中的标识符列表未以省略号结尾,则参数数(包括 在调用函数(如宏)时,不包含预处理标记的参数应相等 宏定义中的参数数。否则,调用中的参数应多于宏定义中的参数(不包括
。应存在
预处理 终止调用的令牌


某些编译器可能允许将其作为扩展,但如果您想要符合标准的代码,则应确保始终为可变宏的省略号参数包含至少一个参数。

@FrançoisMoisan包含与宏和预处理相关的部分。编译时预处理依赖于零参数可变宏处理器递归(foreach,元组).有解决办法吗?@VittorioRomeo:这显然取决于你到底想做什么。我个人不建议你尝试用C预处理器做这么复杂的事情;如果你真的需要这样做,你可以尝试使用不同的、更灵活的预处理器,比如GNU m4或自定义脚本。使用像t这样的工具要集成到基于Makefile的构建系统中并不难,但它会使构建系统更脆弱,更难使用。一个基本的例子是countin可变参数。看起来像
#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;
}
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