响水凹

欢迎来到 Guang-Wen Duan (Dennis Duan) 的个人 Wiki

用户工具

站点工具


computer:c:tips:external_name_in_files

在多个文件中共享external name的方法

全局变量和函数经常在多个地方使用,保持其定义与声明的一致性是程序员的责任。编译器没能力发现所有的不一致问题,不一致的后果可能在运行时才暴露。

由于C语言的定义和声明形式很类似,难以区分,编译器会根据一定的规则进行识别。为了配合编译器工作,同时防止编译器行为与我们预想不一致,良好的做法应该是:

1. 在源文件(.c)中定义全局变量,且一个变量只能有一个定义的地方,定义时不加extern。如:

int errcnt;

最好有一个明确的初始化表达式(虽然全局变量会自动初始化),目的是方便编译器识别。如:

int errcnt = 0;

2. 在其他使用到该变量的地方,使用extern表示引用声明,且不能含初始化表达式。如:

extern int errcnt;

为了方便保持一致和维护,该声明最好放在一个头文件(.h)里,如mydef.h。

3. 如果使用了头文件,则所有涉及该变量的源文件都include该头文件,包括定义该变量的源文件,这样做的好处是方便编译器发现定义与声明的不一致。如:

#include "mydef.h"

以后变量定义若有改动,只需修改头文件与定义源文件两个地方,其他文件会自动获得新的声明。


全局函数的做法与变量类似,我们同样在头文件里添加函数的原型(prototype)声明。如:

extern int my_get_size(void);

由于extern是缺省的,所以也可省略:

int my_get_size(void);
computer/c/tips/external_name_in_files.txt · 最后更改: 2014/11/01 02:02 由 127.0.0.1