全局变量可不可以定义在可被多个.c文件包含的头文件中?

可以,在头文件或不同的c文件中用static来修饰同名全局变量。

另外一点,可以在不同的c文件中声明同名的全局变量,前提是其中只能有一个c文件中对此变量赋值,此时链接不会出错。

extern和static不能同时修饰同一变量。

链接规范,每个c/c++的定义都有链接规范(linkage)的属性。

外部链接(external linkage)的定义可被定义处以外的翻译单元看见并引用。        内部链接(internal linkage)的定义则只能被该定义所处的翻译单元看见,而不能被其他翻译单元引用。

所有定义预设为外部链接,使用static关键字可以把定义改为内部链接。

从技术上讲,声明不会有链接属性,因为声明不会在可执行映像中分配存储空间;因此,不存在链接器是否允许交叉引用那些存储空间的问题。

int i;       定义

extern int i;      声明

全局变量定义在头文件中,因为所有定义预设为外部链接。所以在头文件被.c文件包含以后,等于有两个或更多同等定义的global存在于不同的翻译单元,编译器发现不了错误,因为编译器每次是以翻译单元运作的,但是在连接的时候,连接器会在解析交叉引用时报告“符号被多重定义”错误。

当把全局变量global定义为static时,由于static是定义的变量称为内部链接,所以在各个.c文件中,存在多个同名global但不同等的定义,每个翻译单元中的global维持自己的内存区域,此时链接器不会报告“符号被多重定义”错误。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值