访问翻译单元的const变量

时间:2011-01-14 10:27:11

标签: c++ variables module scope const

在C ++中,const变量隐含地隐藏在其他翻译单元中。有可能阻止吗?

3 个答案:

答案 0 :(得分:7)

是,在定义前添加extern,例如

extern const int x = 10;

答案 1 :(得分:3)

使用extern关键字:

extern const int x = 10;

这会强制变量具有外部链接。

对于命名空间范围变量,这通常是默认值,您可以使用static(或更好的匿名命名空间)来强制内部链接。

我实际上并不知道命名空间范围const变量默认情况下有内部链接,直到我阅读你的问题然后尝试了它,所以谢谢你。每天都学到新的东西!

答案 2 :(得分:3)

可以通过extern关键字:

来实现
// a.cpp
extern const int x = 10; // definition
// b.cpp
extern const int x;      // declaration

这将产生的效果是,如果常量的值在b中发生变化,您将无需重新编译a,但同时您无法使用x }作为b.cpp内的编译时常量(即,您将无法编写int array[x];)。

如果没有非常强烈的理由,我宁愿在头文件中定义常量并包含在需要它的所有翻译单元中;

// c.h
const int x = 10;
// a.cpp
#include "c.h"
// b.cpp
#include "c.h"

每次更改时,您都必须重新编译依赖于常量的所有翻译单元,但您可以在编译时在所有翻译单元中使用它。这种方法的局限性在于,如果更改常量并仅重新编译某些转换单位,则常量的值将不一致(这违反了ODR)。