我认为较新版本的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 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 ()都不会考虑任何命令行选项]

使用某些外壳魔术过滤错误输出,例如。与

{ 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


这将需要一些复杂的逻辑来过滤掉。

[使用bash / kshisms之类的2> >(...)也不有助于第一点,因为make将使用/bin/sh,而不是用户的外壳程序]

关于c - 在GCC中停用“您的意思是……”建议,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58735374/

10-14 13:24
查看更多