c与c++中的extern const的区别和联系

最近复习c++,发现了这个东西。

c语言里面,我们在一个.c文件中用const定义了一个全局变量后,可以在另一个.c文件中用extern const来引用,但在c++中在链接的时候会报undefined reference错误,这是因为在c语言里面,const全局变量在符号表里面是GLOBAL即全局可见的,而在c++里面却是LOCAL即只能在当前编译模块可见。

e.g.

在a.h中:

1 extern const int a;

在a.c中:

1 const int a = 10;

在main.c中:

1 #include<stdio.h>
2 #include"a.h"
3 
4 int main()
5 {
6     printf("%d\n",a);
7 }

gcc a.c main.c -o main

编译成功,输入./main输出10

我们使用gcc -c a.c -o a.o生成a.o,再使用readelf -s a.o查看符号表:

可以看到最后一行,a在符号表中是GLOBAL的。

接下,我们不用改动代码,只是使用g++ a.c main.c -o main来编译程序,可以看到出错:

链接出错,原因是找不到a的定义,

使用g++ -c a.c -o a.o生成a.o,再使用readelf -s a.o查看符号表:

Num为6的那行表明,a变成了一个LOCAL对象,只能在a.o中可见,对main.o不可见。

解决方法:

将a.c 中的

1 const int a = 10;

改为:

1 extern const int a = 10;

这样g++编译器在第一次看到a的定义的时候,因为存在extern关键字,就把它当成GLOBAL对象写入符号表:

 

posted on 2015-02-08 15:00  渊蓝之蓝  阅读(2388)  评论(1编辑  收藏  举报