2012/2/13

By RaySaint


在VS2008中编写C++程序时碰到如下问题:

main.cpp中声明了一个全局const变量:
//! main.cpp
...
const int a = 10;
...


接着在某个类的实现文件中,如consumerthread.cpp中定义的某个成员函数内部使用的该变量(当然,先在该文件头部extern声明该变量)
//consumerthread.cpp

...
extern int a;
 
void ConsumerThread::run()
{
     cout << "a=" << a << endl;
}

虽然上述代码编译可通过,但在链接时会报错提示找不到const int a的定义。

原因:
在C++中当一个全局变量声明为const时,默认情况下为文件内链接,也就是说:
const int a = 10;
相当于
static const int a = 10;

因此,需要显示的告诉编译器你所声明的全局const变量是外部存储的:
//! main.cpp
...
extern const int a = 10; //正确!
...
 
P.S. 经同学验证,gcc下不会出现该问题.