Как подавить предупреждение вариадического аргумента макроса 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, что исключает его создание большинство предупреждений.)
вы можете попробовать использовать это:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wvariadic-macros"
#define FOO(A, ...) foo(A, ##__VA_ARGS__)
#pragma GCC diagnostic pop