У меня есть простой: #define log(text, ...) fprintf(stderr, "stuff before" text "stuff after", ## __VA_ARGS__);
который запускает: error: ISO C99 requires at least one argument for the "..." in a variadic macro [-Werror]
Должно ли использование -std=c11
и -Wno-variadic-macros
не исправлять эту ошибку/предупреждение?
Добавление #pragma GCC system_header
в заголовочный файл перед определением журнала устраняет эту проблему (не обязательно проверял, работает ли выведенный двоичный файл...), но это кажется хакерским, и я не совсем уверен в последствиях этого.
Вот пример ожидаемого поведения: https://stackoverflow.com/a/31327708/5698848
-Wvariadic-macros
Warn if variadic macros are used in ISO C90 mode, or if the GNU alternate syntax is used in ISO C99 mode.
This is enabled by either -Wpedantic or -Wtraditional.
To inhibit the warning messages, use -Wno-variadic-macros.
Любая идея об элегантном решении, чтобы остановить это предупреждение/ошибку из легального кода GNU GCC C? Почему он говорит, что я использую C99, и почему не работает флаг отключения предупреждения для C99? Линия выглядит так:
gcc -c src/file.c -Wall -Werror -Wextra -pedantic -Wfloat-equal -Wwrite-strings -Wcast-qual -Wunreachable-code -Wcast-align -Wstrict-prototypes -Wundef -Wshadow -Wstrict-aliasing -Wstrict-overflow -Wno-variadic-macros -g3 -std=c11 -O2 -flto -Iinclude/ -MMD -MF depend/file.d -o bin/file.o
Обратите внимание, что -pedantic
действительно является виновником.
MCVE
c.c
#include <stdio.h>
#include <stdlib.h>
#define log(text, ...) fprintf(stderr, "stuff before" text "stuff after", ## __VA_ARGS__);
int main(void)
{
log("should work, but doesn't");
log("works fine: %s", "yep");
return EXIT_SUCCESS;
}
Makefile
all:
gcc c.c -Wall -Werror -Wextra -pedantic -Wfloat-equal -Wwrite-strings -Wcast-qual -Wunreachable-code -Wcast-align -Wstrict-prototypes -Wundef -Wshadow -Wstrict-aliasing -Wstrict-overflow -Wno-variadic-macros -g3 -std=c11 -O2
Примечание. Удаление педантичных компиляций нормально — gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
#define log(text, ...) fprintf(stderr, "stuff before" text "stuff after", ## __VA_ARGS__);
— сложный макрос. Еслиtext
не является строковым литералом, он сломан, чего нельзя ожидать от вызова в стилеprintf
. - person Andrew Henle   schedule 16.05.2017##__VA_ARGS__
является расширением GCC. Если вы укажете соответствие ISO, вы не получите расширения gcc (в основном). Вы пытались указать соответствие GNU, например.-std=gnu11
? - person M.M   schedule 16.05.2017-std=c11
, и вы получаете поведение C11. Что вы ожидали? - person M.M   schedule 16.05.2017-Wpedantic
(-pedantic
то же самое, но устарело по очевидным причинам). - person too honest for this site   schedule 16.05.2017