PTT
Submit
Submit
选择语言
正體中文
简体中文
PTT
C_and_CPP
[问题] 外部变量static问题
楼主:
Tverous
(Orah~)
2017-08-04 09:18:53
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
GCC
问题(Question):
最近在c primer plus中看到一段有关使用全域变量的一种方法
/* constant.h
作者:
james732
(好人超)
2017-08-04 09:32:00
你没有加static又给多个.c档include应该就会link error
作者:
Hazukashiine
(私は幸せです)
2017-08-04 09:35:00
compile 的下一步是 link, 如果没有用 static 指定是 internal linkage, 可能会造成识别符名称的污染
楼主:
Tverous
(Orah~)
2017-08-04 10:45:00
想请问污染具体来说是怎样?因为假如使用个区域变量不是就直接隐藏掉全域变量嘛?
作者: stucode
2017-08-04 11:35:00
没有用static修饰的file-scope变量是external linkage这表示它可以被任何编译单元参考到以你的例子而言 file1跟file2会各有一个变量定义假设没有用static修饰 当程式中使用到该变量时linker会不知道要将其链结到哪个变量定义相对来说 若是加了static 在file1中的变量定义就只会在file1中使用时被看见 file2同理至于你会没有遇到错误 可能是你个别编译两个档案并且没有链结它们 又或是像书中所写链结器帮你做了不合标准的额外处理
楼主:
Tverous
(Orah~)
2017-08-04 12:15:00
大概了解了 感谢各位前辈
作者:
PkmX
(阿猫)
2017-08-05 01:18:00
题外话其实C标准J.5.11 Multiple External Definition有特别提到很多实作都会支援可以多个定义 只要不打架就好例如全域变量如果没有初始化gcc会默认把他们都丢到commonsection内 而linker会把所有object file的common symbol合并所以就算有多个定义只要大小一样也是ok的这个功能可以在编译的时候下gcc -fno-common关掉
继续阅读
Re: [公告] 板工请假七天
wtchen
[问题] 二维阵列型别
oToToT
[问题] __attribute__ ((aligned (8)));
SKTP
[问题] 所有c++程式突然都不能跑
a88241050
[问题] 新手问题 传入阵列的size
nova06091
Re: [分享] CMake里面直上Google Test
druid0214
[问题] online judge 上一题如何加速运算?
ddchris
[公告] 板工请假七天
wtchen
[分享] CMake里面直上Google Test
Killercat
[问题] C语言xcode档案输入输出
egg1127
Links
booklink
Contact Us: admin [ a t ] ucptt.com