如何使GCC报告未声明符号的每次出现
How to make GCC report every occurence of an undeclared symbol?
重命名符号时,通常无法手动重命名代码中出现的所有符号。
当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)
- 在数字之间插入 + 或 - 符号以使其等于整数
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 使无符号的 int 值成为有符号的 int 值并返回
- C++使用其他命名空间中的符号,而不使它们可从外部访问
- 使文件目标$(%符号)
- 在C 中使用时,D和E符号之间有什么区别
- 使strncmp()接受无符号的char *作为论点
- 为什么非unicode应用程序系统语言环境使Unicode字体具有错误显示的符号字符
- 使文件重复符号
- 使用 LLVM 的 libc++ 时,__1 符号从何而来?
- 在 C++11 中使函数模板参数无符号
- 使文件链接问题 架构x86_64的未定义符号
- 如何忽略字符串中的重音符号,使其不改变长度
- 无法使Flandmarks工作,C++,错误LNK2019,未解决的外部符号
- 如何使GCC报告未声明符号的每次出现
- 使C++将无符号的char*视为char*
- 为什么编译器不使无符号与有符号的比较安全?
- Win32 API:如何使编辑文本仅在c++中接受无符号浮点数
- 如何使名称空间的内容对整个项目可用而不产生“多重定义符号”错误
- 当我向只接受无符号整数的函数提供有符号整数时,是否有一种方法可以使GCC警告我?