При объявлении внешних переменных область, в которой они отображаются, должна соответствовать области, в которой они определены, уровню уровня имен.И вы вообще не можете определить два глобала с внешней связью в области видимости блока.
Если отложить обсуждение 1 о том, почему вы должны быть осторожны с такими глобальными константами, я бы сказал, что выидем об этом неправильно.Поскольку у вас есть класс Constants
, просто предоставьте эти константы как члены и объявите один внешний экземпляр Constants
.Что-то вроде:
struct Constants {
int BARL;
int BAR_TOL;
Constants();
};
extern Constants const constants;
Тогда другой код может иметь дело с лучшим пространством имен constants.BARL
, которое само является константой, поскольку является подобъектом объекта const constants
.
Соответствующий файл cpp становится таким:
Constants const constants; // definition
Constants::Constants() {
Json::Reader reader;
Json::Value root;
#if VARIANT == A
std::ifstream config_a_file("a.json");
reader.parse(config_a_file, root);
#elif VARIANT == B
std::ifstream config_b_file("b.json");
reader.parse(config_b_file, root);
#endif
BARL = root["BARL"].asInt(); // assignment
BAR_TOL = BARL * 3;
}
1 - Для этого вы можете просмотреть static-order-fiasco для многихпримеры того, почему неопределенный порядок инициализации между статическими переменными в разных единицах перевода может вызвать головную боль.