我有一个简单的宏定义:
在定义log之前的头文件中添加
以下是预期行为的示例:https://dev59.com/FmIj5IYBdhLWcg3wGRiM#31327708 来自GNU的链接:https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
有没有一种优雅的解决方案来阻止这个法定GNU GCC C代码的警告/错误?为什么它说我正在使用C99,为什么禁用C99警告的标志不起作用?行看起来像:
请注意,
注意:移除pedantic可以编译成功 - 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__);
,会触发错误:error: ISO C99 requires at least one argument for the "..." in a variadic macro [-Werror]
使用-std=c11
和-Wno-variadic-macros
是否可以修复此错误/警告?在定义log之前的头文件中添加
#pragma GCC system_header
可以解决此问题(尚未测试输出的二进制文件是否有效...),但这似乎有点hacky,而且我不确定其后果。以下是预期行为的示例:https://dev59.com/FmIj5IYBdhLWcg3wGRiM#31327708 来自GNU的链接:https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
-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
注意:移除pedantic可以编译成功 - 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
风格调用的预期。 - Andrew Henle-Wpedantic
(-pedantic
是相同的,但因为明显的原因已被弃用)的实际含义。 - too honest for this site