gpt4 book ai didi

c - 声明与定义不同的函数没有 GCC 警告

转载 作者:太空宇宙 更新时间:2023-11-04 06:52:13 24 4
gpt4 key购买 nike

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 在这种特殊情况下不生成任何警告?

最佳答案

如评论中所述......

一般而言,您必须在定义函数的地方和使用函数的地方包含声明函数的 header 。你没有,所以编译器无法发出警告。 header 是让编译器进行必要的交叉检查以确保代码基本健全的粘合剂。

问题声称:

  • 出于某些抽象原因,file.h 未包含在 file.c 中。

不清楚这些抽象原因是什么,但无论是什么原因,它都是错误的。由于该问题(尚未)没有更详细地说明问题是什么,我们无法帮助您解决问题。然而,它们是虚假的——你做错了什么。

具体来说,您必须包括file.hfile.c以及 main.c .否则,您将得不到所需的交叉检查——或者您想要的警告。您还需要 bar() 的原型(prototype)在 file.c — 你不应该在范围内调用没有原型(prototype)的函数(严格来说,非原型(prototype)声明就足够了,但你真的想要一个原型(prototype))在范围内,并且 bar() 没有原型(prototype)在<stdint.h>file.h .

我使用 GCC 和选项进行编译:

gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes …

我懒得运行代码,直到它干净为止——事实上,-Werror意味着我不能运行代码,直到它干净,因为如果有任何警告或错误,编译就会失败。如果愿意,您可以负担得起更严格的费用;您不应该冒险采取比这宽松得多的措施。

请注意,C99 和 C11 都要求函数在使用前声明或定义。只有古老的 C90 标准允许调用尚未预先声明或预先定义的函数。

关于c - 声明与定义不同的函数没有 GCC 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49624771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com