C语言在头文件定义全局变量的技巧


在刚开始学习C语言的时候,可能很多人都听过前辈说要少用goto,少用do{}while(),不要在头文件定义全局变量等,但实际上每个特性都有其合适的应用场合,只要正确的使用是不会有问题的,相反还可能给代码带来好处。

一般来说,我们写程序的时候都不会定义特别多的全局变量,这也是需要遵守的原则之一;但凡事都不是绝对的,假如有一个程序有大量的变量都需要全局使用,而这些全局变量之间又没有什么关联性,你会选择怎样的方式来处理这些全局变量呢?

1、使用一个结构体,专门用于存放这些全局变量,这是个方法,也能不错的解决问题,只是没什么关联的数据还用结构体打包在一起,总觉得有点不对。

2、将这些全局变量定义到一个专门的文件,不用结构体打包,然后在头文件使用extern声明,哪里需要用就包含这个头文件就行了。

3、第二种方法需要在头文件使用extern声明每一个全局变量,假如要增加或者删除一个变量的都需要同时修改头文件和源文件,很是不方便,那就将这些全局变量定义到头文件吧。

进入正题,其实第三种方法就是对第二种方法进行优化,让修改只发生在一个文件,下面是示例代码:

源文件:

#include

#define EXPORT_GLOBALS

#include "define_variable_in_header.h"

//编译

//gcc define_variable_in_header.c

//预处理

//gcc -E define_variable_in_header.c -o define_variable_in_header.c.o

//gcc -E define_variable_in_header.h -o define_variable_in_header.h.o

int main(int argc,char *argv[])

{

g_flag = 5;

printf("%d\r\n",g_flag);

return 0;

}

头文件:

#ifndef __DEFINE_VARIABLE_IN_HEADER_H

#define __DEFINE_VARIABLE_IN_HEADER_H

#ifdef EXPORT_GLOBALS

#define EXTERN

#else

#define EXTERN extern

#endif

EXTERN unsigned int g_flag;

#endif/*__DEFINE_VARIABLE_IN_HEADER_H*/

源文件很简单就是先定义一个宏EXPORT_GLOBALS然后再包含对应的头文件,注意顺序不能变;对于头文件,先检测是否定义了EXPORT_GLOBALS宏,如果定义了则将EXTERN宏定义为空,否则定义为extern关键字,然后下面就是我们需要定义的全局变量,只不过前面都加了EXTERN宏;

我们都知道源文件使用#include包含头文件的时候几乎可以认为是将整个头文件的内容拷贝到源文件中,对源文件进行预处理,得到下面的内容:

# 1 "define_variable_in_header.c"

# 1 ""

# 1 ""

# 31 ""

# 1 "/usr/include/stdc-predef.h" 1 3 4

# 32 "" 2

# 1 "define_variable_in_header.c"

# 1 "define_variable_in_header.h" 1

# 10 "define_variable_in_header.h"

unsigned int g_flag;

# 7 "define_variable_in_header.c" 2

int main(int argc,char *argv[])

{

g_flag = 0;

return 0;

}

我们可以在源文件看到全局变量的定义了,那头文件呢:

# 1 "define_variable_in_header.h"

# 1 ""

# 1 ""

# 31 ""

# 1 "/usr/include/stdc-predef.h" 1 3 4

# 32 "" 2

# 1 "define_variable_in_header.h"

# 10 "define_variable_in_header.h"

extern unsigned int g_flag;

可以看到头文件经过预处理后,就得到了全局变量的声明了,这样做每次需要修改全局变量的时候,都只需要改一下头文件就行了,而不需要头文件源文件都更改,减少了工作量和出错率。

乔·科尔
燕云十六声丑娘奇遇任务怎么完成 丑娘任务图文流程攻略