Возможно ли иметь уникальный адрес, выделенный для переменной 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, объявленный в одном заголовке, так что все единицы перевода могут использовать его в своих постоянных выражениях и что все единицы перевода согласны относительно адреса этого символа? Я ожидаю, что некоторый дополнительный код будет обозначать единую единицу перевода, где этот символ действительно принадлежит, как и переменные extern
и не extern
без constexpr
.