Вот пример кода, который я использовал для воспроизведения этой ошибки:
#include <iostream>
#define TEST_2_ARG_MACRO_OVERLOAD(_1,_2,FUNC_NAME,...) FUNC_NAME
#define TEST_HELLO_IMPL(condition) do{ \
if(!(condition)) {\
std::cout << "hello!" << std::endl; \
}\
} while(0)
#define TEST_HELLO_MESSAGE_IMPL(condition, message) do{ \
if(!(condition)) {\
std::cout << "hello" << message << std::endl; \
}\
} while(0)
//Runs during runtime and debug
#define TEST_HELLO(...) TEST_2_ARG_MACRO_OVERLOAD(__VA_ARGS__, TEST_HELLO_MESSAGE_IMPL, TEST_HELLO_IMPL)(__VA_ARGS__)
int main()
{
auto x = 3 * (3);
TEST_HELLO(x >= 3);
}
В Godbolt с GCC x86-64 8.2, используя:
-std=c++14 -Wall -Wextra -Wshadow -Wnon-virtual-dtor -Wpedantic -Werror
в качестве аргумента я получаю следующую ошибку:
<source>:24:22: error: ISO C++11 requires at least one argument for the "..." in a variadic macro [-Werror]
TEST_HELLO(x >= 3);
^
cc1plus: all warnings being treated as errors
Compiler returned: 1
Однако в макросе явно есть хотя бы один аргумент. Теперь я знаю, что это компилируется, когда я не включаю это предупреждение, и когда я не включаю это предупреждение как ошибку, но по другим причинам я хочу оставить эти флаги компилятора (или, по крайней мере, сохранить те же результаты).
Почему GCC утверждает, что я передал ноль аргументов, а я нет?