我发现here函数原型在函数调用之前是必要的,如果函数低于函数调用。
我在gcc编译器中检查了这个案例,并且在没有函数原型的情况下编译代码。
示例:
#include <stdio.h>
//int sum (int, int); -- it runs with this commented line
int main (void)
{
int total;
total = sum (2, 3);
printf ("Total is %d\n", total);
return 0;
}
int sum (int a, int b)
{
return a + b;
}
可以解释一下这个问题吗?
答案 0 :(得分:3)
它在this页面上说:&#34;您不必首先声明该函数,但如果您不这样做,C编译器将假定该函数返回一个int(即使后面定义的实函数不会)。&。 #34;
确认here.
至于参数:&#34;并没有假设其论点。&#34;
答案 1 :(得分:2)
如果在调用函数原型之前未提供函数原型,则编译器会假定函数已在某个位置定义,该函数将在链接阶段与其定义相关联。假定默认返回类型为int
,并且不假设函数参数。这称为隐式声明。这意味着这里假定的函数签名是
int sum();
这里,空参数列表表示函数sum
采用固定但未知数量的参数,所有参数都是未知类型。它与函数声明
int sum(void);
但是,在C++
中,上述两个声明完全相同。如果函数的返回类型不是int
,则假定的函数签名不匹配,这将导致编译错误。事实上,C99
和C11
中存在错误。在调用之前,你应该总是提供函数原型。
答案 2 :(得分:0)
我将您的代码更改为#include
/* int sum (int, int); -- it runs with this commented line */
int
main (void)
{
int total;
total = sum (2, 3);
printf ("Total is %d\n", total);
return 0;
}
int
sum (int a, int b)
{
return a + b;
}
然后编译:
gcc --std=c90 -ansi -pedantic node.c
我也尝试了一些standard
,但可能与gcc版本和C标准有关。