两个config.json文件包含要存储到常量中的值。我的计划是在相应类的构造函数中加载并解析json文件,并将值分配给常量。但是,在调试模式下,会出现错误“ ... LNK2019:无法解析的外部符号...”。
那么,不可能在构造函数中定义常量吗?
由于常量的值取决于变量VARIANT
,因此我制作了ifelse
来读取正确的.json文件。
// constants.h
extern const int BARL;
extern const int BAR_TOL;
// constants.cpp
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
const int BARL = root["BARL"].asInt();
const int BAR_TOL = BARL * 3;
}
我期望常量BARL
和BAR_TOL
可以在整个constants.cpp类中使用。但是,找不到它们的定义。
答案 0 :(得分:6)
在声明外部变量时,它们出现的作用域必须与它们定义的作用域匹配到名称空间级别。而且,您根本无法在块范围内定义两个具有外部链接的全局变量。
撇开关于为什么要谨慎使用此类全局常量的讨论 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来获得许多示例,这些示例说明了为什么不同翻译单元中的静态变量之间未指定的初始化顺序会引起麻烦。