为什么GCC对未声明的功能发出警告不一致?

时间:2012-02-23 15:42:56

标签: c gcc warnings

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

为什么?

2 个答案:

答案 0 :(得分:8)

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

我相信,基于前面的快速扫描,C99(PDF link)删除了这个。不过,海湾合作委员会仍然允许他们(带警告)并不令人惊讶;我无法想象有多少代码会开始无法编译......


建议使用-Wall(打开所有警告),这样您就可以获得大量的附加信息(当您有非常好的理由时,您可以关闭特定的警告他们如果需要的话)。

答案 1 :(得分:2)

在声明函数之前不能使用它。当函数声明不可见时,实现在C89中假定函数:

  • 采用未指定(但固定)的参数数量

  • 返回int

这称为隐式函数声明

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