在C ++中,const
变量隐含地隐藏在其他翻译单元中。有可能阻止吗?
答案 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)。