为什么GCC在未声明函数时发出警告不一致?

5
以下是test.c程序。
int main() {
   dummySum(1, 2);
   return 0;
}

int dummySum(int a, int b) {
   return a + b;
}

当使用gcc -o test test.c编译时,以下代码不会生成任何警告,而下面的代码会:

int main() {
   dummySum(1, 2);
   return 0;
}

void dummySum(int a, int b) {
   a + b;
}

为什么?

不是这样的。我也曾这么想过。dummySum 函数的返回类型是 int 还是 void - mattjgalloway
1
未声明函数的默认返回类型是int。当您将其声明为void时,它找不到任何匹配的函数。我相信如果您使用更强的警告检查(例如-Wall),无论哪种情况都会收到警告。 - Joe
1
在第一篇帖子中是相同的,你说得对。我编辑了帖子。抱歉。 - Manuel Selva
2个回答

8
当遇到一个未声明的函数时,编译器会假定这是一个接受给定数量参数并返回int的函数 (我想是这样)。你的第二个函数没有这个,所以你会得到重新定义的警告。
我相信,根据前言的快速扫描,C99 (PDF链接) 已经删除了这个问题。不过,GCC 仍然允许它们存在(带有警告),我无法想象有多少代码将开始无法编译……
建议使用-Wall(打开所有警告)以便获得大量的附加信息(如果需要,可以关闭特定的警告,当你有一个真正好的理由执行生成警告操作的代码时)。

在C99中,'implicit int'已被移除,因此在严格的C99模式或C11模式下,它不应该编译,我个人认为。然而,gcc会编译它并只是发出一个警告(对于两者都是如此)。 - Daniel Fischer
@DanielFischer:有趣!实际上,我刚看了一下C99,我认为它比那更进一步:它完全删除了隐式函数声明。(有趣的是,前言将这两个项目分别列出,“删除了隐式的'int'”和“删除了隐式函数声明”)。我怀疑“隐式的'int'”指的是一个被声明但没有任何返回类型的函数。 - T.J. Crowder
可能是因为我不是语言专家,所以在所有类型未声明的情况下,我倾向于使用“隐式int”。 - Daniel Fischer

2

函数必须在声明之后才能使用。当函数声明不可见时,在C89中,实现会假设该函数:

  • 接受未指定(但固定)数量的参数

  • 返回一个int类型的值

这被称为隐式函数声明。

在C99中,函数的隐式声明已被从语言中移除,实现可以拒绝翻译源代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接