GCC 如何停止 ROM 中函数的误报警告 implicit-function-declaration?
GCC how to stop false positive warning implicit-function-declaration for functions in ROM?
我想删除代码库中的所有 implicit-function-declaration 警告。但是有一个问题,因为有些功能是
在工厂和链接描述文件中编程到微控制器 ROM 中,仅提供函数地址。这些函数由SDK中的代码调用。
在编译过程中,gcc 当然会发出警告 implicit-function-declaration
。我怎样才能摆脱这个警告?
需要说明的是,我明白为什么会有警告,它是什么意思。但在这种特殊情况下,SDK 的开发人员保证代码将使用隐式规则(即隐式函数只接受整数和 returns 一个整数)。所以这个警告是误报。
这只是 gnu-C-99,没有 c++。
想法:
- 猜猜参数类型,在 header 中写一个原型并将其包括在内?
- 告诉 gcc 使用 gcc 的某些属性将此类函数视为误报?
[因表扬而写全]
您正在使用自己的代码编译供应商 SDK。这通常不是您想要做的。
您所做的是使用 gcc -c -Wno-implicit-function-declaration
构建他们的 SDK 文件,并使用 gcc -c
或可能 gcc -o output all-your-c-files all-their-o-files
.
构建您自己的文件
您可以在 header 中创建原型函数,或者使用以下命令抑制警告:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wimplicit-function-declaration"
/* line where GCC complains about implicit function declaration */
#pragma GCC diagnostic pop
C 不要求声明是原型,因此您可以解决这个问题(这应该是 硬错误,而不是警告,因为隐式声明无效C) 通过使用非原型声明,这只需要知道 return 类型。例如:
int foo();
由于 "implicit declarations" 在历史上被视为 returning int
,您可以简单地对所有这些使用 int
。
编写一个小程序,从链接描述文件生成一个头文件romfunctions.h
,有这样一行
int rom_function();
对于 ROM 定义的每个符号。 运行 此程序来自您的 Makefile。更改所有使用这些函数的文件以包含 romfunctions.h
。这样,如果链接描述文件发生变化,您就不必手动更新头文件。
如果您使用的是 C 程序,请使用
#include <stdio.h>
因为我的大部分编程专业知识都是通过自学获得的,所以我有意对解决非致命警告变得有些厌恶,特别是为了避免养成不良的编码习惯。但是,这向我揭示了这种不良的编码习惯非常普遍,即使是受过正规培训的程序员也是如此。特别是,对于像我这样对不使用 MS Windows 感到厌恶的人,我对所谓的平台无关代码(如 OpenGL 和 Vulkan)的自学揭示了世界上不良的编码习惯,尤其是当我检查假设学生使用 Visual Studio 和 Windows C/C++ 编译器编写的代码。
最近,我在设计 Ubuntu Qt 控制台实现在线示例时遇到了无数非致命警告,该示例说明如何将 SPIR-V 着色器与 OpenGL 结合使用。我终于认输并将以下行添加到我的 qmake .PRO 文件中以消除非致命警告(之后,首先,研究每一个并说服自己可以安全地忽略它):
QMAKE_CFLAGS += -Wno-隐式函数声明
-Wno-address-of-packed-member
我想删除代码库中的所有 implicit-function-declaration 警告。但是有一个问题,因为有些功能是 在工厂和链接描述文件中编程到微控制器 ROM 中,仅提供函数地址。这些函数由SDK中的代码调用。
在编译过程中,gcc 当然会发出警告 implicit-function-declaration
。我怎样才能摆脱这个警告?
需要说明的是,我明白为什么会有警告,它是什么意思。但在这种特殊情况下,SDK 的开发人员保证代码将使用隐式规则(即隐式函数只接受整数和 returns 一个整数)。所以这个警告是误报。
这只是 gnu-C-99,没有 c++。
想法:
- 猜猜参数类型,在 header 中写一个原型并将其包括在内?
- 告诉 gcc 使用 gcc 的某些属性将此类函数视为误报?
[因表扬而写全]
您正在使用自己的代码编译供应商 SDK。这通常不是您想要做的。
您所做的是使用 gcc -c -Wno-implicit-function-declaration
构建他们的 SDK 文件,并使用 gcc -c
或可能 gcc -o output all-your-c-files all-their-o-files
.
您可以在 header 中创建原型函数,或者使用以下命令抑制警告:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wimplicit-function-declaration"
/* line where GCC complains about implicit function declaration */
#pragma GCC diagnostic pop
C 不要求声明是原型,因此您可以解决这个问题(这应该是 硬错误,而不是警告,因为隐式声明无效C) 通过使用非原型声明,这只需要知道 return 类型。例如:
int foo();
由于 "implicit declarations" 在历史上被视为 returning int
,您可以简单地对所有这些使用 int
。
编写一个小程序,从链接描述文件生成一个头文件romfunctions.h
,有这样一行
int rom_function();
对于 ROM 定义的每个符号。 运行 此程序来自您的 Makefile。更改所有使用这些函数的文件以包含 romfunctions.h
。这样,如果链接描述文件发生变化,您就不必手动更新头文件。
如果您使用的是 C 程序,请使用
#include <stdio.h>
因为我的大部分编程专业知识都是通过自学获得的,所以我有意对解决非致命警告变得有些厌恶,特别是为了避免养成不良的编码习惯。但是,这向我揭示了这种不良的编码习惯非常普遍,即使是受过正规培训的程序员也是如此。特别是,对于像我这样对不使用 MS Windows 感到厌恶的人,我对所谓的平台无关代码(如 OpenGL 和 Vulkan)的自学揭示了世界上不良的编码习惯,尤其是当我检查假设学生使用 Visual Studio 和 Windows C/C++ 编译器编写的代码。
最近,我在设计 Ubuntu Qt 控制台实现在线示例时遇到了无数非致命警告,该示例说明如何将 SPIR-V 着色器与 OpenGL 结合使用。我终于认输并将以下行添加到我的 qmake .PRO 文件中以消除非致命警告(之后,首先,研究每一个并说服自己可以安全地忽略它):
QMAKE_CFLAGS += -Wno-隐式函数声明
-Wno-address-of-packed-member