C语言中的函数原型

ice*_*oal 1 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;
}
Run Code Online (Sandbox Code Playgroud)

你可能已经注意到,当声明函数'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.
Run Code Online (Sandbox Code Playgroud)

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

Kei*_*son 6

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

函数声明为编译器提供足够的信息以生成对函数的调用.甲定义提供声明,此外,定义了当调用该函数时将要执行的代码(之间的东西{}).

函数声明(这不是一个定义的一部分)可以包括参数类型,或类型和他们的名字,但不只是他们的名字.(如果它包含类型,那么它就是原型.)

一个旧式函数定义可以有参数的不仅仅是名称,例如:

int sum(a, b)
int a;
int b;
{
    return a + b;
}
Run Code Online (Sandbox Code Playgroud)

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

您的声明可能如下所示:

int sum();
Run Code Online (Sandbox Code Playgroud)

但它应该是这样的:

int sum(int a, int b);
Run Code Online (Sandbox Code Playgroud)

甚至这个:

int sum(int, int);
Run Code Online (Sandbox Code Playgroud)

哦,int main ()写得更好int main(void).