如何使GCC报告未声明符号的每次出现

How to make GCC report every occurence of an undeclared symbol?

本文关键字:符号 何使 GCC 报告 未声明      更新时间:2023-10-16

重命名符号时,通常无法手动重命名代码中出现的所有符号。

当GCC报告错误时,它只告诉"(每个未声明的符号只报告一次)"。

我希望它报告所有的事件。有可能吗?

我的第一个问题是:为什么?当我更改符号的名称时,我会这样做使用全局搜索和替换:在我的编辑器(vim)中:

:argdo %s/<oldname>/newname/g

(这会将中所有文件中的oldname的所有实例更改为newname编辑器的参数列表,但仅当oldname是完整的象征即someoldname将不会改变。)

如果名称是全局名称,那么我将在shell中使用sed:

for f in $(find root -name '*.hh' -o -name '*.cc')
do
    sed 's/<oldname>/newname/g' $f > tmp && mv tmp $x
done

如果你在Windows下,我相信VS也有类似的可能性全局搜索并替换解决方案中的所有源文件。

你不是为了找到你知道的错误而编译的;一般来说更容易首先修复它们。

您可以制作GCC插件或MELT扩展来实现这一点。2021年,MELT已经过时(因为缺乏资金)。也许俾斯麦可以在2021年春季使用。

您也可以修补GCC源代码。它是免费软件。

但我真的不认为这是值得的(这可能需要你一天以上的时间)。您也可以尝试一些替代编译器,例如LLVM/Clang。

我的感觉是,你只需要重新编译并更正你的源代码,直到你没有得到警告(gcc -Wall -Wextra)或错误。实际上,这是最简单、最容易的方法。

你也可以试试Clang静态分析仪,或者对欧洲DECODER项目感兴趣。

最重要的是,您应该(对于用C或C++编码的大型软件)记录一些编码约定,并且在您的团队中进行一些代码审查。MISRA C或GNU编码约定可能是鼓舞人心的;或GTK或Qt中记录和遵循的内容。

顺便说一句,你的问题在2021年令人惊讶。由于在实践中,GCC只需要几秒钟就可以重新编译大多数C++翻译单元。当然,奇怪的模板扩展也有已知的例外,但在我看来,每个C++源文件超过10秒的编译时间是导致重新编码该文件的一个症状。


Emacs实用建议

例如,您可以将emacs编辑器配置为一键编译(例如,将键盘的F11功能键绑定到recompile emacs操作,例如,绑定F10功能键跳到下一个错误,例如,将其放入.emacs:

 ; inside .emacs
 (global-set-key [f10] 'next-error)
 (global-set-key [f11] 'recompile)