本文根据http://www.cnblogs.com/chenchenluo/archive/2011/09/03/2165765.html,摘录并记录一些内容
头文件的基本应用在前面<模块化编程学习>中有所提及,在这里对此进行细究
存储类说明符
Extern:
出现在顶层或块的外部变量函数与变量声明中,表示声明的对象具有静态生存期, 连接程序知道其名字.
Static:
可以放在函数与变量声明中,在函数定义时,只用于指定函数名,而不将函数导出到链接程序,在函数声明中,表示其后边会有定义声明的函数,存储类型static.在数据声明中,总是表示定义的声明不导出到连接程序.
根据上面所述,只要我们在头文件中用extern声明了一个函数play(),接下来无论在哪里调用,连接程序都可以找到。
何时需要使用extern声明一个函数呢?
在.h文件中声明的函数,如果在其对应的.c文件中有定义,那么我们在声明这个函数时,不使用extern修饰符, 如果反之,则必须显示使用extern修饰符.
解释:在《C专家编程》中提过定义与声明的区别:
定义:是一种特殊的声明,它创建了一个对象。
声明:简单的说明了在其他地方创建的对象的名字,它允许你使用这个名字
上面引用的话中,我认为意思仅仅为,在使用的.c文件中如果没有定义,则使用extern来表述。
extern全局变量
extern对象声明告诉编译器对象的类型和名字,对象的内存分配则在别处进行。由于并未在声明中为数组分配内存,所以并不需要提供关于数组长度的信息。这样做还有一个好处,在需要对全局变量的长度进行修改时,不用把所有的引用声明也全部修改了。
宏定义的技巧
比如a.h文件当中有:
#ifdef AAA
int i=0;
#else
int i;
#endif
那么,在a.c文件当中,有如下语句:
......
#define AAA
#include "a.h"
......
而对于其他的任何包含a.h文件的头文件或者.c源文件,只需要直接包含a.h就行了
......
#include "a.h"
......
这样就可以达到在a.c文件当中定义变量一次,而在其他的文件当中声明该变量的目的.
当然了,你完全可以根据自己的需要来决定在哪个需要包含a.h的文件当中定义宏AAA,但> 是我要说的是
在同一个工程的不同的需要包含a.h的文件当中,你只能定义AAA一次,否则在连接这些目> 标文件时会出现
重复定义的错误,即使你的单独目标文件编译没有任何的问题.
网友评论