warning: function declaration isn’t a prototype(函数声明不是原型)的解决办法

本文介绍了一种常见的Linux驱动开发中的错误——函数声明不规范导致的编译警告,并提供了具体的修正方法。
linux驱动中定义一个无参的函数
int probe_num()
{
            ....
}
警告:函数声明不是一个原型 [-Wstrict-prototypes]

应对方法:
改成
int probe_num(void)
{
            ....
}

警告消失


In file included from lib_verify/validateUbootWithRecover.c:4: lib_verify/md5.h:60:1: warning: function declaration isn't a prototype [-Wstrict-prototypes] 60 | void MD5_Init (); | ^~~~ lib_verify/md5.h:61:1: warning: function declaration isn't a prototype [-Wstrict-prototypes] 61 | void MD5_Update (); | ^~~~ lib_verify/md5.h:62:1: warning: function declaration isn't a prototype [-Wstrict-prototypes] 62 | void MD5_Final (); | ^~~~ lib_verify/validateUbootWithRecover.c: In function 'validatePartitions': lib_verify/validateUbootWithRecover.c:524:41: error: 'ROOTFS_DATA_OFFSET' undeclared (first use in this function); did you mean 'BOOT_ADDR_OFFSET'? 524 | writeFlash(BOOTLOADER_OFFSET, base + ROOTFS_DATA_OFFSET, ntohl(header->bootloaderLen)); | ^~~~~~~~~~~~~~~~~~ | BOOT_ADDR_OFFSET lib_verify/validateUbootWithRecover.c:524:41: note: each undeclared identifier is reported only once for each function it appears in lib_verify/validateUbootWithRecover.c: In function 'checkTpHeaderMagicNumber': lib_verify/validateUbootWithRecover.c:534:9: warning: unused variable 'i' [-Wunused-variable] 534 | int i; | ^ lib_verify/validateUbootWithRecover.c: In function 'validateUbootWithRecover': lib_verify/validateUbootWithRecover.c:37:26: warning: passing argument 2 of 'readFlash' makes pointer from integer without a cast [-Wint-conversion] 37 | #define CONFIG_LOADADDR 0x22100000 | ^~~~~~~~~~ | | | int lib_verify/validateUbootWithRecover.c:579:21: note: in expansion of macro 'CONFIG_LOADADDR' 579 | ret = readFlash(0, CONFIG_LOADADDR, CFG_FLASH_SIZE); | ^~~~~~~~~~~~~~~ lib_verify/validateUbootWithRecover.c:185:52: note: expected 'uint8_t *' {aka 'unsigned char *'} but argument is of type 'int' 185 | static int readFlash(uint32_t addrOffset, uint8_t* buf, uint32_t buflen) | ~~~~~~~~~^~~ lib_verify/validateUbootWithRecover.c:549:19: warning: unused variable 'skipValidate' [-Wunused-variable] 549 | unsigned char skipValidate = 0; | ^~~~~~~~~~~~ At top level: lib_verify/validateUbootWithRecover.c:261:12: warning: 'eraseFlash' defined but not used [-Wunused-function] 261 | static int eraseFlash(uint32_t addrOffset, uint32_t eraselen)
最新发布
10-25
`error: function declaration isn’t a prototype` 是一个在 C 语言编译过程中常见的编译错误(或警告升级为错误),通常由 GCC 编译器在启用严格标准检查时(如 `-Wstrict-prototypes`)报告。 这个错误的意思是:**函数声明没有使用完整的原型形式**,即函数的参数列表未明确说明。 --- ### 原因分析: 在 C 语言中,一个“完整”的函数原型应该明确写出所有参数的类型。如果只写函数名和返回类型,而没有具体参数类型,就被认为是“旧式”函数声明,不符合现代 C 标准(如 C99 及以后)。 #### 错误示例: ```c void func(); // 这样声明表示函数可以接受任意数量和类型的参数(老式风格) ``` 这在语法上是合法的,但 **不是函数原型prototype)**,因为它没有说明参数。如果你在开启了 `-Werror -Wstrict-prototypes` 的情况下编译,GCC 会把这个警告当作错误处理,从而报错: > error: function declaration isn’t a prototype --- #### 正确做法(提供完整原型): 如果你的函数不接受任何参数,应该使用 `void` 明确表示: ```c void func(void); // 正确:明确表示无参数 ``` 这才是符合现代 C 标准的函数原型。 --- ### 示例对比: ❌ 错误写法: ```c int main() { return 0; } void print_message(); // 报错:这不是一个原型! ``` ✅ 正确写法: ```c int main() { return 0; } void print_message(void); // 正确:这是一个完整的函数原型 ``` --- ### 如何解决? 1. 找到报错的函数声明行。 2. 如果该函数不带参数,在括号中加上 `void`。 3. 如果该函数带参数,确保每个参数的类型都明确写出,例如: ```c int add(int a, int b); ``` --- ### 补充说明: - 这个问题常见于头文件 `.h` 中的函数声明。 - 使用 `gcc -std=c99 -Wall -Wextra -Werror -Wstrict-prototypes` 等严格选项时更容易触发。 --- ### 总结: > `error: function declaration isn’t a prototype` 是因为你声明了一个函数,但没有使用“完整原型”形式。 > 解决方法:用 `func(void)` 代替 `func()` 来表示无参函数。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值