【问题标题】:No GCC warning for function with declaration different from definition声明与定义不同的函数没有 GCC 警告
【发布时间】:2018-04-03 16:09:02
【问题描述】:

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 不生成任何警告?

【问题讨论】:

  • 你在 .c 中包含 .h 吗?
  • 我看不到任何定义,我只看到声明...
  • 您必须在定义函数的位置和使用函数的位置都包含标题。你没有,所以编译器无法警告。标头是允许编译器进行必要的交叉检查以确保代码基本健全的粘合剂。
  • 出于抽象原因,您破坏了使用标头的主要原因之一?请详细说明。

标签: c gcc


【解决方案1】:

如 cmets 中所述……

一般而言,您必须包含声明函数的标头,其中包含函数的定义位置和使用位置。你没有,所以编译器无法警告。标头是允许编译器进行必要的交叉检查以确保代码基本健全的粘合剂。

问题声称:

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

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

具体来说,您必须file.cmain.c 中包含file.h。否则,您将得不到您需要的交叉检查——或您想要的警告。您还需要 file.c 中的 bar() 的原型——您不应该在没有原型的情况下调用函数(严格来说,非原型声明就足够了,但您真的想要一个原型)在范围内,并且在 &lt;stdint.h&gt;file.h 中都没有 bar() 的原型。

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

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

在代码干净之前我不会运行代码 — 实际上,-Werror 意味着在代码干净之前我无法运行代码,因为如果出现任何警告或错误,编译将失败。如果您愿意,您可以负担得起更严格的要求;你不应该冒险比那严格得多。

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

【讨论】:

  • 值得注意的是,非原型格式的函数声明在 C 标准中被列为过时的特性,因此在未来的版本中可能会从语言中删除非原型声明。
猜你喜欢
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 2019-08-06
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多