我想摆脱我的代码库中的所有隐式函数声明警告。但是存在一个问题,因为一些功能在工厂被编程到微控制器ROM中,并且在链接期间链接器脚本仅提供功能地址。这些函数由SDK中的代码调用。
在编译期间,gcc当然会发出警告implicit-function-declaration
。我怎么能摆脱这个警告?
要明确我理解为什么警告在那里,它是什么意思。但在这种特殊情况下,SDK的开发人员保证代码将使用隐式规则(即隐式函数只接受整数并返回一个int)。所以这个警告是误报。
这只是gnu-C-99,没有c ++。
思路:
您可以在标头中创建原型函数,也可以使用以下内容抑制警告:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wimplicit-function-declaration"
/* line where GCC complains about implicit function declaration */
#pragma GCC diagnostic pop
[完全由于赞扬而写]
您正在使用自己的代码编译供应商SDK。这通常不是您想要做的。
你要做的是用gcc -c -Wno-implicit-function-declaration
和你自己的gcc -c
或gcc -o output all-your-c-files all-their-o-files
文件构建他们的SDK文件。
C不要求声明是原型,所以你可以通过使用非原型声明来解决问题(这应该是一个硬错误,而不是警告,因为隐式声明不是有效的C),这只需要知道返回类型。例如:
int foo();
由于“隐式声明”在历史上被视为返回int
,因此您可以简单地将int
用于所有这些。
编写一个小程序,从链接器脚本生成头文件romfunctions.h
,使用这样的行
int rom_function();
对于ROM定义的每个符号。从Makefile中运行此程序。更改使用这些函数的所有文件以包含romfunctions.h
。这样,如果链接描述文件发生更改,则不必手动更新头文件。