Как подавить предупреждение вариадического аргумента макроса GCC для нулевых аргументов для определенного определения макроса в исходном файле

Я хочу подавить предупреждение GCC variadic Macro argument для нулевых аргументов, например:

// for illustration purposes only:
int foo(int i) { return 0; };
#define FOO(A, ...) foo(A, ##__VA_ARGS__)
FOO(1);
     ^  warning: ISO C++11 requires at least one argument for the "..." in a variadic macro

для определенного определения макроса в исходном файле при использовании GCC 5.3.0.

в Clang это делается следующим образом:

// ... large file
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
#define FOO(A, ...) foo(A, ##__VA_ARGS__)
#pragma clang diagnostic pop
// ... large file

// not necessary on the same file
FOO(1);  // doesnt trigger the warning

в gcc это выглядит как -pedantic является магическим типом предупреждения, поэтому следующее просто не работает:

// ... large file
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpedantic"
#define FOO(A, ...) foo(A, ##__VA_ARGS__)
#pragma GCC diagnostic pop
// ... large file

чтобы быть ясным, предупреждение должно быть включено во всей программе, кроме в этом конкретном фрагменте кода. Это про тонкую настройку. Отключение предупреждения в GCC для всей программы может быть достигнуто просто не проходя -pedantic для компилятора.

2 ответов


вы должны быть в состоянии подавить это с помощью

#pragma GCC system_header

но это относится к остальной части файла, и вы не можете использовать его только в включенных файлах. Таким образом, не обеспечивает идеального охвата и может потребовать некоторого перетасовки / косвенного включения файлов заголовков.

(но, честно говоря, если вы не можете исправить файл заголовка должен соответствовать стандартам, вы также можете считать весь заголовок system_header, что исключает его создание большинство предупреждений.)

см.https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html


вы можете попробовать использовать это:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wvariadic-macros"
#define FOO(A, ...) foo(A, ##__VA_ARGS__)
#pragma GCC diagnostic pop