`gnu-zero-variadic-macro-arguments`是否可以忽略?

时间:2014-01-21 18:34:10

标签: c++ c++11 warnings c-preprocessor variadic-macros

请考虑以下代码(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宏的...参数传递参数是否安全? (基本上忽略警告)

或者它可能导致问题?

标准是否明确禁止?

1 个答案:

答案 0 :(得分:1)

这在标准上是技术上禁止的。从C ++11§16.3/ 4(重点补充):

  

如果宏定义中的标识符列表没有以省略号结尾,则参数的数量(包括   在调用类函数宏时,那些由没有预处理标记组成的参数应该相等   宏定义中的参数数量。 否则,调用中的参数应该多于宏定义中的参数(...除外)。应存在)预处理   终止调用的令牌。

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