C语言 - 调用没有函数原型的函数

时间:2014-03-16 18:57:11

标签: c function-prototypes

我发现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;
}

可以解释一下这个问题吗?

3 个答案:

答案 0 :(得分:3)

它在this页面上说:&#34;您不必首先声明该函数,但如果您不这样做,C编译器将假定该函数返回一个int(即使后面定义的实函数不会)。&。 #34;

确认here.

至于参数:&#34;并没有假设其论点。&#34;

答案 1 :(得分:2)

如果在调用函数原型之前未提供函数原型,则编译器会假定函数已在某个位置定义,该函数将在链接阶段与其定义相关联。假定默认返回类型为int,并且不假设函数参数。这称为隐式声明。这意味着这里假定的函数签名是

int sum();

这里,空参数列表表示函数sum采用固定但未知数量的参数,所有参数都是未知类型。它与函数声明

不同
int sum(void);

但是,在C++中,上述两个声明完全相同。如果函数的返回类型不是int,则假定的函数签名不匹配,这将导致编译错误。事实上,C99C11中存在错误。在调用之前,你应该总是提供函数原型。

答案 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标准有关。