一、变量
1、全局变量
1)位置问题
全局变量的位置:全局变量的定义和初始化放在c文件中,声明放在对应的h文件中。后果:定义在.h文件中,在链接的时候会报变量重复定义错误
2)声明与定义的区分
变量的声明有两种情况:
a.一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
b.一种是不需要建立存储空间的。 例如:extern int a 其中变量a是在别的文件中定义的。
把建立空间的声明成为“定义”,把不需要建立存储空间的成为“声明”。
基本类型变量的声明和定义(初始化)是同时产生的;而对于对象来说,声明和定义是分开的。
用static来声明一个变量的作用有二:
(1)对于局部变量用static声明,则是为该变量分配的空间在整个程序的执行期内都始终存在。
(2)外部变量用static来声明,则该变量的作用只限于本文件模块。
3)定义、声明与引用
方法一:在某个c文件里定义全局变量后,在其它c文件要用,则在该c文件里用extern进行声明。
注意:定义全局变量的同时初始化变量;用extern进行声明时不能再初始化否则会报错。
方法二:在某个c文件中定义变量并初始化,然后再该c文件的h文件中用extern进行声明,此时不能再初始化。最后在需要使用该变量的其他c文件中包含前面的h文件。(移植性更好)
二、头文件
1、什么是头文件
头文件就是对用户的说明:函数,参数,各种各样的接口的说明——关于函数,变量,类的“声明”(对函数来说,也叫函数原型),而非定义。
2、头文件的包含
相应的c文件中包含所需的h文件。但千万不要将这些头文件全部放在c文件的相应头文件里。可以将c文件和h文件看作一个整体,移植时全部移走。
三、宏定义、结构体、typedef定义的位置问题
1、若结构体类型只需要在某个c文件中使用,那么就在相应c文件里定义该结构体即可。
2、若结构体类型要在多个c文件中使用,那么就应该在头文件中定义该结构体,再在要用它的文件中包含结构体定义所在的头文件即可。
(宏定义、结构体、typedef结论一样,放的位置相同)
四、extern的使用
1、对变量来说
extern int a;//声明一个全局变量a
int a; //定义一个全局变量a
extern int a =0 ;//定义一个全局变量a 并给初值。
int a =0;//定义一个全局变量a,并给初值
第三和第四都是定义一个可以被外部使用的全局变量,并给初值。但两者不能同时出现,不管是int a;还是extern int a=0;还是int a=0;都只能出现一次。定义只能出现一次,而那个extern int a可以出现很多次。
当引用一个全局变量的时候,就必须要声明,extern int a; 这时候extern不能省略,因为省略了,就变成int a;这是一个定义,不是声明。注:extern int a; 中类型int可省略,即extern a; 但其他类型则不能省略
2、对函数来说
定义的时候用extern,说明这个函数是可以被外部引用的,声明的时候用extern说明这是一个声明。 但由于函数的定义和声明是有区别的,定义函数要有函数体,声明函数没有函数体(且以分号结尾),所以函数定义和声明时都可以将extern省略掉。
3、总结
1、变量:
如果想在源文件A中使用源文件B的变量,方法有2种:
(1)在A文件中必须用extern声明在B文件中定义的变量(当然是全局变量);
(2)在A文件中添加B文件对应的头文件,且B头文件包含B文件中的变量声明,也即在这个头文件中必须用extern声明该变量,否则,该变量又被定义一次。
2、函数:
如果你想源文件A中使用源文件B的函数,方法有2种:
(1)在A文件中用extern声明在B文件中定义的函数(可省略extern,只需在A文件中出现B文件定义函数原型即可);
(2)在A文件中添加B文件对应的头文件,且B头文件包含B文件中的函数原型,在头文件中函数可以不用加extern。