C 变量

变量的声明与定义

  • 定义 —— 所谓的定义就是编译器创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们所说的变量名/对象名。这个名字一旦和这块内存匹配起来,它们就同生共死,终生不离不弃,并且这块内存的位置也不能被改变。一个变量或对象在一定区域内(涉及作用域和生命周期)只能被定义一次,如果定义多次,编译器会提示你重复定义同一个变量或对象。
  • 声明 —— 告诉编译器,这个名字已经匹配到一块内存上了,所以你不能再用它作为将要定义的变量名/对象名。和变量的定义不同,变量的声明是可以出现多次的,并且在多个源文件中使用该变量之前都应该先声明。

全局变量

假设在一个 .c 文件里定义全局变量 a 为 int 型,然后在头文件声明了 extern int a;,可是另一个 .c 文件在使用变量 a 的时候觉得 double 会更好,然后就声明了 extern double a;,但是又没有把所有类型修改过来,这会导致编译出错。解决办法是要么所有声明都使用 extern a; 不指定类型,由变量定义的地方确定类型。

为了确保全局变量的唯一性,可以在头文件中使用如下宏定义进行保护。

#ifdef xxx_GLOBALS
#define xxx_EXT
#else
#define xxx_EXT extern
#endif

并只在真正定义该变量的源文件中添加 xxx_GLOBALS 宏定义(在引用该头文件之前)。

#define xxx_GLOBALS
#include "xxx.h"

当编译器处理 .c 文件时,它强制 xxx_EXT 为空(因为 xxx_GLOBALS 已经定义),所以编译器会为全局变量分配内存空间。而其他的 .c 文件,由于 xxx_GLOBALS 没有定义,所以 xxx_EXT 被定义为 extern,这样用户就可以调用外部全局变量了。

Leave a Reply