在GCC中停用“您的意思是...”建议

较新版本的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],而没有有用的建议。

xjqjz 回答:在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,而不是用户的外壳]

,

除您自己进行修改外,我认为gcc中没有解决方案。一种非最佳解决方案是用于sed

gcc main.c 2>&1 | sed -E "s/; did you mean .*\?//"

我在这里所做的是使用stderrstdout(打印警告的地方)重定向到2>&1,然后制作了一个简单的替换脚本来删除该短语。

它增加了一些复杂性,使您失去了色彩,但是却满足了您的要求。

,

@ImpudentSnob的解决方案仅需添加一点,即可过滤掉这些建议行:

  1. 找到您的gcc,例如在我的情况下:~/.espressif/.../xtensa-esp32-elf-gcc
  2. 通过在名称末尾添加“ .didyoumean”来重命名,例如xtensa-esp32-elf-gcc.didyoumean
  3. 使用原始gcc名称将此脚本放在此处:
#!/bin/bash

set -o pipefail
{ $0.didyoumean "$@" 2>&1 >&3 | awk '{if (sub("; did you mean [^?]*[?]","")) cnt=4} (cnt!=1){print} (cnt>0){cnt--}' >&2;} 3>&1
本文链接:https://www.f2er.com/3150195.html

大家都在问