关于全局变量被定义在一个被多个.c文件包含的头文件时出现错误

今天笔者在编写代码时遇到一个问题,我需要在多个.c文件中使用一个数组变量char bufffer【10】,为方便讲解,我另外创建了三个文件,两个.c文件为test1.c,test2.c,头文件为test.h,两个.c文件都要#include "test.h",下面来详解一下遇到的问题

错误1:在test1.c中定义buffer, 在test2.c中引用buffer,无法引用,即使通过extern关键字也不行

错误1原因:外部变量只能初始化一次,且必须在定义该变量时进行,另外如果外部变量定义在一个文件中,那么其他文件在使用该变量之前必须声明它,所以我们应该这样写:

(extern 关键字用于声明在其他文件中已经定义的外部变量,不清楚extern,static,atuo等关键字以及存储器和作用域这些的读者可以去我的主页翻看另一篇介绍存储类别、作用域、链接的文章)

int a; //定义式声明

extern int a; //引用式声明

错误2:在test.h中定义buffer,在test1.c和test2.c中使用buffer

出现以下问题:

错误2原因:#include头文件时,会把头文件的内容搬到include处,也就是说在test1.c和test2.c中都会包含以下内容:

因为buffer具有全局作用域,所以我们相当于定义了buffer两次

ifndef是否能解决这个问题?:我查阅了一些资料,有人说ifndef能解决这个问题,时间比较少,我没有去尝试,后面有时间会和大家讨论下这个问题,个人感觉不可以,因为#define怎么定义内容可变的字符数组呢?当然如果有读者知道可以在评论留言

(不了解#include、#define、#ifndef等的读者可以去我的主页翻看相应文章)

可行的做法:在一个多次使用该变量的.c文件中定义该变量,在被该文件以及其他.c文件#include的头文件中通过extern声明该变量,在其他#include该头文件的.c文件中就可以使用该变量了

总结:个人感觉上面这种应该是最恰当的了,不仅对普通变量使用,对数组也适用,而且不需要在每一个使用该变量的.c文件中都去extern声明一下(实际上编译器替我们做了这步),另外送给读者一句话:变量和函数的定义都应该在.c文件中而不是.h文件中

举报/反馈

举报
评论 0