以下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;
}
为什么?
答案 0 :(得分:8)
当遇到未声明的函数时,编译器会假定一个函数接受给定数量的参数(我认为)并返回int
(那部分我肯定的)。你的第二个没有,所以你得到重新定义警告。
我相信,基于前面的快速扫描,C99(PDF link)删除了这个。不过,海湾合作委员会仍然允许他们(带警告)并不令人惊讶;我无法想象有多少代码会开始无法编译......
建议使用-Wall
(打开所有警告),这样您就可以获得大量的附加信息(当您有非常好的理由时,您可以关闭特定的警告他们如果需要的话)。
答案 1 :(得分:2)
在声明函数之前不能使用它。当函数声明不可见时,实现在C89中假定函数:
采用未指定(但固定)的参数数量
返回int
这称为隐式函数声明。
在C99中,函数的隐式声明已被删除,并且实现可以自由拒绝翻译源代码。