![](/img/trans.png)
[英]No warning from gcc when function definition in linked source different from function prototype in header
[英]No GCC warning for function with declaration different from definition
C文件定义:
#include <stdint.h>
void foo(int i)
{
if(i>0) bar();
}
H文件声明:
#ifndef FILE_H
#define FILE_H
void foo(void);
#endif FILE_H
主要:
#include "file.h"
int main(void)
{
foo();
}
该file.h
不包括在file.c
某些抽象的原因。 为什么在这种特殊情况下,GCC不会生成任何警告?
如评论中所述…
一般而言, 必须在定义函数和使用函数的位置都包含用于声明函数的标头。 您没有,因此编译器无法发出警告。 标头是使编译器进行必要的交叉检查以确保代码基本健康的粘合剂。
问题声称:
目前尚不清楚这些抽象原因是什么,但是无论推理如何,都是错误的。 由于该问题(尚未)更详细地说明了问题所在,因此我们无法帮助您解决问题。 但是,它们是虚假的-您做错了什么。
具体而言,您必须包括file.h
在file.c
以及在main.c
。 否则,您将无法得到所需的交叉检查或期望的警告。 您还需要file.c
bar()
的原型-在范围内,没有原型(严格地说,非原型声明就足够了,但是您确实想要一个原型),就不应该调用函数,并且没有原型对于<stdint.h>
或file.h
bar()
。
我使用GCC和选项进行编译:
gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes …
在干净之前,我不会花时间去运行代码-实际上, -Werror
意味着直到干净之前,我才能运行代码,因为如果有任何警告或错误,编译会失败。 如果愿意,您可以承受更严格的要求。 您不应该冒险比这严格得多。
请注意,C99和C11都要求在使用之前声明或定义函数。 仅古老的C90标准允许调用尚未预先声明或预先定义的功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.