您的位置:首页 > 编程语言 > C语言/C++

VS2008编译环境下全局const变量在其他编译模块中引用注意的问题

2012-02-13 11:11 405 查看
2012/2/13

By RaySaint

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

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

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

...
extern int a;

[align=left]void ConsumerThread::run()[/align]
[align=left]{[/align]
[align=left] cout << "a=" << a << endl;[/align]
[align=left]}[/align]

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

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

[align=left]因此,需要显示的告诉编译器你所声明的全局const变量是外部存储的:[/align]
[align=left]//! main.cpp[/align]
[align=left]...[/align]
[align=left]extern const int a = 10; //正确![/align]
[align=left]...[/align]
[align=left] [/align]
[align=left]P.S. 经同学验证,gcc下不会出现该问题.[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息