是否可以为 constexpr 变量分配一个唯一地址,即变量可用的所有翻译单元都相同(通常通过标题)?考虑以下示例:
// foo.hh
#include <iostream>
constexpr int foo = 42;
// a.cc
#include "foo.hh"
void a(void) { std::cout << "a: " << &foo << std::endl; }
// b.cc
#include "foo.hh"
extern void a(void);
int main(int argc, char** argv) {
a();
std::cout << "b: " << &foo << std::endl;
}
分别编译a.cc
并b.cc
使用 gcc 4.7 将它们链接在一起,我看到打印了两个不同的地址。extern
如果我在标题中添加关键字,我会收到一个链接器错误duplicate symbol _foo in: a.o and b.o
,我觉得这有点令人惊讶,因为我认为添加extern
更有可能导致编译器从另一个对象导入该符号,而不是从当前对象导出它。但似乎我对事情如何运作的理解在这里是错误的。
是否有一种合理的方法可以在一个标头中声明一个 constexpr,以便所有翻译单元都可以在其常量表达式中使用它,并且所有翻译单元都同意该符号的地址?我希望有一些额外的代码来表示这个符号实际属于的单个翻译单元,就像 withextern
和 non- extern
variables without一样constexpr
。