关于全局变量被定义在一个被多个.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文件中

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值