较新版本的GCC带有我认为是令人不快的功能:他们试图对我进行第二次猜测,散发出无用的“你是什么意思?”淹没其他警告的建议。
例如:
$ gcc -Wall -c -o /dev/null -xc - <<'EOT'
#include <stdlib.h>
void foo(char *b, size_t z){ readlink("/foo", b, z); }
EOT
<stdin>: In function ‘foo’:
<stdin>:3:30: warning: implicit declaration of function ‘readlink’;
did you mean ‘realloc’? [-Wimplicit-function-declaration]
[不,我不是说realloc
;我只是忘了包含unistd.h
标头。
有没有办法关闭此功能?
我想只打印implicit declaration of function ‘readlink’ [-Wimplicit-function-declaration]
,没有有用的建议。
我认为gcc
中没有解决方案,除非您自己进行修改。一种非最佳解决方案正在传递到sed
。
gcc main.c 2>&1 | sed -E "s/; did you mean .*\?//g"
[我在这里正在用stderr
将stdout
(打印警告的地方)重定向到2>&1
,然后我制作了一个简单的替换脚本来删除该短语。
[它增加了一些复杂性,并且您失去了颜色,但是它满足了您的要求。
事实证明,它只是经过硬编码,并且没有办法将其关闭。
从gcc source:
3328 warned = warning_at
3329 (&richloc, OPT_Wimplicit_function_declaration,
3330 G_("implicit declaration of function %qE; did you mean %qs?"),
3331 id, suggestion);
[[不,lookup_name_fuzzy()
和hint.suggestion ()
在返回结果时都不会考虑任何命令行选项]
[使用某些shell手段过滤错误输出,例如与
{ gcc ... 2>&1 >&3 | sed 's/; did you mean [^?]*[?]//' >&2; } 3>&1
并不是真正的解决方案,首先是因为它不能在makefile文件中使用(命令行的错误状态将是sed
或任何过滤器的错误状态,而不是gcc的错误状态),其次,因为它仍然存在像:
void foo(char *b, size_t z){ readlink("/foo", b, z); }
^~~~~~~~
realloc
这将需要一些复杂的逻辑来过滤掉。
[[使用2> >(...)
这样的bash / kshisms也不会帮助第一点,因为make
将使用/bin/sh
,而不是用户的外壳]