1.函数的定义
函数的定义即函数的具体实现。
2.函数声明
函数声明就是对函数进行声明,告诉编译器,系统中存在这样的函数,一般在调用函数时使用,即函数调用:**先声明,后调用**。
函数原型式声明:
int fun(int a, int b); // 函数名字fun,返回类型 int,有2个int 参数
函数简单声明:
int fun(int, int); // 函数名字fun,默认返回类型(其实也是int),有2个int 参数
2.1 函数本地声明
int f();本地声明和外部声明基本没有太大区别,本地声明即告诉编译器此函数是在当前c文件中定义的;
2.2 函数外部声明
extern int f();函数的声明中带有关键字extern即声明此函数在外部实现,外部声明即告诉编译器这个函数可能在别的源文件里定义。
函数本地声明和函数外部声明没有明显的区别:extern int f(); 和int f();其仅仅起到对函数声明的作用,函数声明和函数定义没有很大的联系,除了函数声明的返回值、函数名称、参数类型和个数与函数定义一致即可。函数声明是为了函数调用,避免参数传入错误而进行声明的,所以函数声明因函数调用而生。
2.2.1函数的外部声明的好处和坏处
好处:extern int f();在函数调用的源文件前面或者头文件中对调用的函数进行外部声明,不用关心其定义在哪个文件中,或者在程序中进行include “*.h”(调用的函数声明所在的头文件),在一些复杂的项目中,我比较习惯在所有的函数声明前添加extern修饰。
坏处:比如我们引用了一个库文件的某个函数,我们在调用它时,将它在我们调用的源文件或者头文件将其声明为外部函数,如果库文件的原函数参数发生了变化,我们编译时,是不会报错的,但是函数运行时,因为少了或者多了输入参数,往往会照成系统错误。
解决办法:目前业界针对这种情况的处理没有一个很完美的方案,通常的做法是提供方在自己的xxx_pub.h中提供对外部接口的声明,然后调用方include该头文件,从而省去extern这一步。以避免这种错误。
**宝剑有双锋,对extern的应用,不同的场合应该选择不同的做法。**
3.变量定义与声明
3.1变量定义
int a;即对变量的定义,此变量为全局变量时,方可进行外部声明。
3.2变量声明
extern int a;对全局变量int a进行声明,**先声明,后调用。**
4.结构体的定义与声明
4.1结构体的定义
结构体类型定义:
typedef struct __SCHOOL {
string teacher;
string address;
string phone;
} SHANGHAI_SCHOOL, BEIJING_SCHOOL;
结构体变量实体:
SHANGHAI_SCHOOL sh_school;
BEIJING_SCHOOL bj_school;
4.2结构体的声明
** ** 只有结构体实体才可以进行声明,如果在外部函数中要使用到全局变量sh_school和bj_school时,可以如下:
extern SHANGHAI_SCHOOL sh_school;
extern BEIJING_SCHOOL bj_school;
如果在外部实现了一个函数,函数参数需要用到外部的一个结构体:
struct _SCHOOL;/类似于int一样,如此就可以使用了结构体_SCHOOL了/
int get_school_info(struct _SCHOOL school,int a){
}
版权归原作者 smartvxworks 所有, 如有侵权,请联系我们删除。