函数声明

来源:互联网 发布:cmake ubuntu 教程 编辑:程序博客网 时间:2024/04/29 05:35

    本文将C语言的函数声明在这里做一总结。尤其注意同一工程中多个文件间函数调用和声明的关系,很多C语言的教材上没有涉及此话题。

 

1.目的:

    函数声明的目的是告诉编译器被调用函数的返回值类型、参数个数及参数类型,以便编译器检查函数调用语句的合法性。

 

2.语法:

    函数声明的语法格式通常与函数定义的头部是一致的,我们把函数定义的头部拷贝下来,在后面加个分号就是函数声明语句了。如果被调用函数是在另一个文件中定义的,可以在前面加一个extern,以表示是外部函数,也可以省略extern。

 

3.位置:

    函数声明既可以放在某个函数的内部,也可以放在所有函数的外面。如果放在函数内部,则被声明函数只能在该函数内部被调用。如果放在所有函数的外面,则声明后面的所有函数都能调用被声明函数。通常的做法是:将所有函数的声明统一放在所有函数的最前面。

 

4.函数声明可以省略的两种情况:

    1) 被调用的函数定义在调用它的函数之前,这时被调用的函数可以不用声明;

这是因为编译系统会先遇到被调用的函数定义,所以在调用之前已经知道该函数的返回值和参数类型。

 

    2) 函数的返回值和参数类型都为整型。

这是因为,当省略函数声明时,编译系统会默认被调用的函数的返回值类型和参数类型是整型。

注意: 有些书上说当函数的返回值为整型时,可以省略函数声明。这种说法是不恰当的,在Dev C++平台下测试,不仅返回值要为整型,参数也要为整型时,才可以省略函数声明,否则编译会报错“conflicting types for function_name”。比如一个函数的头部这样定义:int fun(float p),在省略函数声明的情况下,编译系统先遇到对函数fun的调用时,已经默认fun的返回值类型和参数类型是整型,但是当遇到该函数的定义时,发现函数的参数类型并不是整型,因此认为是“冲突的类型”。 

建议:对所有的函数都进行声明,即使有时候可以省略。不要偷懒,这样做比较安全。

 

5.多文件间的函数调用和声明:

    在一个工程中,多个文件分别包含了一些函数的定义,如果一个文件内的函数要调用另一个文件内的函数,也需要进行函数声明。不过,情况和单个文件有所不同。我在Dev C++平台下进行了实验,创建了一个“console application”类型的C工程,除了默认的main.c,还添加了两个程序文件file1.c和file2.c。

    第一个实验的代码如下所示:

//file1.c 定义了一个函数fun1

float fun1(intp)

{

    return 3.11*p;  

}


//file2.c定义了一个函数fun2

float fun2(intp)

{

    return 3.22*p;

}


//main.c 调用函数fun1和fun2

#include“stdio.h”

int main()

{      

    float r1,r2;

    r1= fun1();  //错误的调用

    r2= fun2();  //错误的调用

    printf(" r1 = %f r2 =%f\n",r1,r2);

    return 0;

}

    第一个实验我们没有在main.c中对被调用函数fun1和fun2进行声明,而且还写了错误的函数调用语句(没有传递参数)。对工程进行编译,没有报出任何错误,运行结果如下:


    这个结果显然是看不懂的。

注意 :如果上面三个文件的内容在同一个文件中,编译时会报错。

 

    接下来 ,我们再做一个实验:在main函数中增加对函数fun1和fun2的声明,但是声明是错误的,即和函数定义的头部不一致。函数调用也是错误的,但是和声明是一致的。修改后的main.c的定义如下:

//main.c 调用函数fun1和fun2

#include“stdio.h”

extern floatfun1();    //错误的声明

externfloat fun2();    //错误的声明

int main()

{      

     float r1,r2;

     r1= fun1();  //错误的调用

     r2= fun2();  //错误的调用

     printf("r1 = %f r2 = %f\n",r1,r2);

     return 0;

}

    同样,编译时没有报出任何错误,运行结果如下:

 

    注意这个结果比较有意思,因为没有给fun1和fun2传递参数,函数省略了参数p,直接返回了3.11和3.22。

 

    最后一个实验,在main函数中使用正确的函数声明,但是进行错误的函数调用。修改后的main.c的定义如下:

//main.c 调用函数fun1和fun2

#include“stdio.h”

extern floatfun1(int);    //正确的声明

externfloat fun2(int);    //正确的声明

int main()

{      

     float r1,r2;

     r1= fun1();  //错误的调用

     r2= fun2();  //错误的调用

     printf("r1 = %f r2 = %f\n",r1,r2);

     return 0;

}

    这种情况下,编译会报错

 

    从以上的实验中我们得出结论:同一工程中多个文件间存在函数调用时,应该进行函数声明,并确保声明是正确的。这样就可以防止错误的函数调用和错误的运行结果。

1 0