函数的定义与声明

目录

1.函数的定义

2.函数声明

2.1 函数本地声明

2.2 函数外部声明

 2.2.1函数的外部声明的好处和坏处

3.变量定义与声明

3.1变量定义

3.2变量声明

4.结构体的定义与声明

4.1结构体的定义

4.2结构体的声明


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){

}

猜你喜欢

转载自blog.csdn.net/smartvxworks/article/details/129142506