繁体   English   中英

没有声明与定义不同的功能的GCC警告

[英]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中。

目前尚不清楚这些抽象原因是什么,但是无论推理如何,都是错误的。 由于该问题(尚未)更详细地说明了问题所在,因此我们无法帮助您解决问题。 但是,它们是虚假的-您做错了什么。

具体而言,您必须包括file.hfile.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM