c-为什么GCC在为未声明的函数发出警告方面不一致



以下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;
}

为什么?

当遇到未声明的函数时,编译器假设一个函数接受给定数量的参数(我认为)并返回int。你的第二个没有,所以你得到了重新定义的警告。

我相信,基于非常快速的向前扫描,C99(PDF链接)删除了这个。毫不奇怪,海湾合作委员会仍然允许他们(带着警告);我无法想象有多少代码会开始编译失败。。。


建议使用-Wall(打开所有警告),这样您就可以获得大量的额外信息(如果需要,当您对所做的任何产生警告的事情都有充分的理由时,您可以关闭特定警告)。

函数在声明之前不能使用。当函数声明不可见时,实现在C89中假设函数:
  • 采用未指定(但固定)数量的参数

  • 返回int

这被称为隐式函数声明

在C99中,函数的隐式声明已经从语言中删除,并且实现可以自由拒绝翻译源代码。

最新更新