在 GCC 中禁用 "did you mean..." 建议
Disabling the "did you mean..." suggestions in GCC
较新版本的 GCC 带有我认为令人恼火的错误功能:它们试图 second-guess 我发出无用的 "did you mean?" 建议,淹没了其他警告。
例如:
$ 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
header.
有什么方法可以关闭它吗?
我只想打印 implicit declaration of function ‘readlink’ [-Wimplicit-function-declaration]
,没有有用的建议。
我认为 gcc
中没有解决方案,除非您自己进行修改。一个非最优的解决方案是管道进入 sed
.
gcc main.c 2>&1 | sed -E "s/; did you mean .*\?//"
我在这里做的是使用 2>&1
将 stderr
(打印警告的地方)重定向到 stdout
,然后我制作了一个简单的替换脚本来删除该短语。
它增加了一些复杂性,并且您失去了颜色,但它满足了您的要求。
原来它只是硬编码的,没有办法关闭它。
来自 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
,而不是用户的 shell ]
只是@ImpudentSnob 对解决方案的一点补充,也过滤掉了那些建议行:
- 找到你的 gcc,就像我的情况一样:
~/.espressif/.../xtensa-esp32-elf-gcc
- 通过在名称末尾添加“.didyoumean”来重命名,例如
xtensa-esp32-elf-gcc.didyoumean
- 将此脚本放在那里,使用原来的 gcc 名称:
#!/bin/bash
set -o pipefail
{ [=10=].didyoumean "$@" 2>&1 >&3 | awk '{if (sub("; did you mean [^?]*[?]", "")) cnt=4} (cnt!=1){print} (cnt>0){cnt--}' >&2;} 3>&1
较新版本的 GCC 带有我认为令人恼火的错误功能:它们试图 second-guess 我发出无用的 "did you mean?" 建议,淹没了其他警告。
例如:
$ 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
header.
有什么方法可以关闭它吗?
我只想打印 implicit declaration of function ‘readlink’ [-Wimplicit-function-declaration]
,没有有用的建议。
我认为 gcc
中没有解决方案,除非您自己进行修改。一个非最优的解决方案是管道进入 sed
.
gcc main.c 2>&1 | sed -E "s/; did you mean .*\?//"
我在这里做的是使用 2>&1
将 stderr
(打印警告的地方)重定向到 stdout
,然后我制作了一个简单的替换脚本来删除该短语。
它增加了一些复杂性,并且您失去了颜色,但它满足了您的要求。
原来它只是硬编码的,没有办法关闭它。
来自 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
,而不是用户的 shell ]
只是@ImpudentSnob 对解决方案的一点补充,也过滤掉了那些建议行:
- 找到你的 gcc,就像我的情况一样:
~/.espressif/.../xtensa-esp32-elf-gcc
- 通过在名称末尾添加“.didyoumean”来重命名,例如
xtensa-esp32-elf-gcc.didyoumean
- 将此脚本放在那里,使用原来的 gcc 名称:
#!/bin/bash
set -o pipefail
{ [=10=].didyoumean "$@" 2>&1 >&3 | awk '{if (sub("; did you mean [^?]*[?]", "")) cnt=4} (cnt!=1){print} (cnt>0){cnt--}' >&2;} 3>&1