关于C和C++不同源文件中重名变量的问题
2014-03-30 22:09
337 查看
在CSAPP中看到的程序链接规则:
函数名, 有初值的全局变量, 编译器会把它作为"强"符号,
而无初值的全局变量, 编译器会把它作为"弱"符号.
链接的时候, 如果不同文件中出现同名的"强"符号, 链接失败.
如果同名的有一个"强"符号, 多个弱符号, 链接"强"符号, 丢弃"弱"符号.
如果只有多个同名的"弱"符号, 则随机选一个链入可执行文件, 这也是有道理的, 因为反正没有初值, 随便选一个就好了.
使用C程序用GCC验证这一过程, 没有问题, 但用C++程序, 以G++来编译, 出现了符号多次定义的链接错误.
问题出在编译上, gcc遇到int c;全局变量, 会把它作为Common符号,是一个"弱符号",
而g++在编译C++程序时, 遇到 int c全局变量, 会把它放在OBJ文件的BSS段里, 是"强"符号, 所以就出现了强符号冲突的情况.
gcc, g++在编译时, 对有非0初值的全局int, 会放在Data段, 而对0初值的全局int, 会放在BSS段, 放BSS里毕竟可以省可执行文件的体积. 这一点没区别.
但在处理没写初值的int时, 有了区别, 似乎g++会默认它初始化成0, 而gcc看它没初始化就让它Common了.
函数名, 有初值的全局变量, 编译器会把它作为"强"符号,
而无初值的全局变量, 编译器会把它作为"弱"符号.
链接的时候, 如果不同文件中出现同名的"强"符号, 链接失败.
如果同名的有一个"强"符号, 多个弱符号, 链接"强"符号, 丢弃"弱"符号.
如果只有多个同名的"弱"符号, 则随机选一个链入可执行文件, 这也是有道理的, 因为反正没有初值, 随便选一个就好了.
使用C程序用GCC验证这一过程, 没有问题, 但用C++程序, 以G++来编译, 出现了符号多次定义的链接错误.
//文件1: int c; int main (int argc, char const* argv[]) { c+=1; return 0; } //文件2: int c; //文件3: int c:
问题出在编译上, gcc遇到int c;全局变量, 会把它作为Common符号,是一个"弱符号",
而g++在编译C++程序时, 遇到 int c全局变量, 会把它放在OBJ文件的BSS段里, 是"强"符号, 所以就出现了强符号冲突的情况.
gcc, g++在编译时, 对有非0初值的全局int, 会放在Data段, 而对0初值的全局int, 会放在BSS段, 放BSS里毕竟可以省可执行文件的体积. 这一点没区别.
但在处理没写初值的int时, 有了区别, 似乎g++会默认它初始化成0, 而gcc看它没初始化就让它Common了.
相关文章推荐
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。
- 关于C++头文件问题
- 关于C/C++使用stdio读写文件的问题
- 关于winodows下编程c++遇到的引用文件路径问题
- 关于C++中类的初始化列表中初始化变量顺序问题
- 关于 keil c51 头文件中变量名声明问题
- 关于头文件定义全局变量等问题
- C++添加一个头文件和extern以及全局变量和局部变量问题(16.3.19上机的一小题)
- C/C++中关于函数调用结束后变量释放的问题
- 小细节:关于C++各种变量的size问题。
- VS2017 c++关于#include 头文件错误问题
- Eclipse+CDT自动生成的代码 C++ 头文件重名问题
- 关于c++网络编程头文件顺序的问题
- 关于在不同手机上出现的so文件找不到的问题
- 关于C++调用C函数或变量的问题
- C++、Java和Matlab不同语言关于 y=(++x)+(++x);结果不同的问题
- 关于全局变量,如何被多个.c文件共享问题
- 关于全局变量,如何被多个.c文件共享问题
- c++中switch case 中关于变量定义问题
- 关于C++头文件相互包含的问题(个人见解)