c与c++中的extern const的区别和联系
2015-02-08 15:00
169 查看
最近复习c++,发现了这个东西。
c语言里面,我们在一个.c文件中用const定义了一个全局变量后,可以在另一个.c文件中用extern const来引用,但在c++中在链接的时候会报undefined reference错误,这是因为在c语言里面,const全局变量在符号表里面是GLOBAL即全局可见的,而在c++里面却是LOCAL即只能在当前编译模块可见。
e.g.
在a.h中:
在a.c中:
在main.c中:
gcc a.c main.c -o main
编译成功,输入./main输出10
我们使用gcc -c a.c -o a.o生成a.o,再使用readelf -s a.o查看符号表:
![](http://images.cnitblog.com/blog/369122/201502/081232165007522.png)
可以看到最后一行,a在符号表中是GLOBAL的。
接下,我们不用改动代码,只是使用g++ a.c main.c -o main来编译程序,可以看到出错:
![](http://images.cnitblog.com/blog/369122/201502/081235177667999.png)
链接出错,原因是找不到a的定义,
使用g++ -c a.c -o a.o生成a.o,再使用readelf -s a.o查看符号表:
![](http://images.cnitblog.com/blog/369122/201502/081237033134178.png)
Num为6的那行表明,a变成了一个LOCAL对象,只能在a.o中可见,对main.o不可见。
解决方法:
将a.c 中的
改为:
这样g++编译器在第一次看到a的定义的时候,因为存在extern关键字,就把它当成GLOBAL对象写入符号表:
c语言里面,我们在一个.c文件中用const定义了一个全局变量后,可以在另一个.c文件中用extern const来引用,但在c++中在链接的时候会报undefined reference错误,这是因为在c语言里面,const全局变量在符号表里面是GLOBAL即全局可见的,而在c++里面却是LOCAL即只能在当前编译模块可见。
e.g.
在a.h中:
extern const int a;
在a.c中:
const int a = 10;
在main.c中:
#include<stdio.h> #include"a.h" int main() { printf("%d\n",a); }
gcc a.c main.c -o main
编译成功,输入./main输出10
我们使用gcc -c a.c -o a.o生成a.o,再使用readelf -s a.o查看符号表:
![](http://images.cnitblog.com/blog/369122/201502/081232165007522.png)
可以看到最后一行,a在符号表中是GLOBAL的。
接下,我们不用改动代码,只是使用g++ a.c main.c -o main来编译程序,可以看到出错:
![](http://images.cnitblog.com/blog/369122/201502/081235177667999.png)
链接出错,原因是找不到a的定义,
使用g++ -c a.c -o a.o生成a.o,再使用readelf -s a.o查看符号表:
![](http://images.cnitblog.com/blog/369122/201502/081237033134178.png)
Num为6的那行表明,a变成了一个LOCAL对象,只能在a.o中可见,对main.o不可见。
解决方法:
将a.c 中的
const int a = 10;
改为:
externconst int a = 10;
这样g++编译器在第一次看到a的定义的时候,因为存在extern关键字,就把它当成GLOBAL对象写入符号表:
![](http://images.cnitblog.com/blog/369122/201502/081459227195415.png)
相关文章推荐
- 全局变量、extern/static/const区别与联系
- 全局变量、extern/static/const区别与联系
- 全局变量、extern/static/const区别与联系
- 全局变量、extern/static/const区别与联系
- 全局变量、extern/static/const区别与联系
- 全局变量、extern/static/const区别与联系
- C++笔记:全局变量、extern/static/const区别与联系
- 全局变量、extern/static/const区别与联系
- <转载>全局变量、extern/static/const区别与联系
- 浅谈C++中const成员和非const成员的联系和区别
- 全局变量、extern/static/const区别与联系
- 全局变量、extern、static和const区别与联系
- 全局变量、extern/static/const区别与联系
- 全局变量、extern/static/const区别与联系
- c++中使用const关键字的联系区别
- [转载]全局变量、extern/static/const区别与联系 2011-11-28 10:08
- static const extern在C与C++中的区别
- 全局变量、extern/static/const区别与联系
- 全局变量、extern/static/const区别与联系(转载)
- 全局变量、extern/static/const区别与联系