C语言中的函数原型

时间:2012-04-13 23:49:58

标签: c clang function-prototypes

今天,Clang试图编写一个程序,给了我一个奇怪的信息。我对C不是很熟悉,所以我可能做错了,但我实际尝试过的代码就是:

#include <stdio.h>
#include <stdlib.h>

int sum(a,b);

int main ()
{
    printf(sum(1,2));
    return 0;
}

int sum (int a, int b)
{
    return a + b;
}

正如你可能已经注意到的那样,当声明函数'sum'时,我不包括param。类型,所以预计会出错,但Clang给出的实际信息是:

ind.c:4:9: error: a parameter list without types is only allowed in a function definition
int sum(a,b);
        ^
ind.c:12:5: error: redefinition of 'sum' as different kind of symbol
int sum (int a, int b)
    ^
ind.c:4:5: note: previous definition is here
int sum(a,b);
    ^
2 errors generated.

当Clang说它只在函数定义中允许时,它意味着什么? int sum(a,b);不是函数定义吗?

2 个答案:

答案 0 :(得分:6)

不,int sum(a, b);是,或者看起来像是一个函数声明,而不是定义

函数声明为编译器提供了足够的信息来生成对函数的调用。定义提供了一个声明,此外,还定义了在调用函数时将执行的代码({}之间的内容)。

函数声明(不是定义的一部分)可能包括参数的类型,类型和名称,但不仅仅是它们的名称。 (如果它包含类型,则它是原型。)

旧式函数定义可以只包含参数的名称,例如:

int sum(a, b)
int a;
int b;
{
    return a + b;
}

但旧式的定义和声明已经过时,最好避免使用。旧式声明未指定参数的类型数,因此编译器无法验证调用的正确性。

您的声明可以看起来像这样:

int sum();

应该看起来像这样:

int sum(int a, int b);

甚至是这样:

int sum(int, int);

哦,int main ()最好写成int main(void)

答案 1 :(得分:3)

int sum();是一个函数声明。它命名函数但不告诉编译器它的作用。告诉编译器它所做的是定义函数,以便它意味着什么。如果您使用带括号的大括号而不是分号,那么您将拥有一个函数定义。