我在头文件中定义了一个简单的配置结构,其中包含一系列其他简单结构,这些结构只是静态变量的容器。这是一个例子:
// Config.h
struct Config {
struct Server {
static constexpr const char* url = "http://example.com";
static constexpr float polling_interval = 1.0f;
};
struct Window {
static constexpr int width = 1920;
static constexpr int height = 1200;
};
};
我将头文件包含在我需要的位置并访问如下变量:Config::Window::width
这很好但在某个时刻我需要从文件中加载值,所以我将变量声明更改为常量(例如static constexpr int width = 1920;
成为static int width;
)。现在链接器抱怨变量的未定义符号。 static constexpr
对象的链接与static
对象的链接不同吗?还有其他我想念的东西吗?
答案 0 :(得分:1)
您缺少非constexpr成员的定义。在.cpp文件中你需要有例如。
int Config::width;
答案 1 :(得分:1)
constexpr
成员隐式内联,因此无需定义。一旦它们是适当的变量,您需要在翻译单元(.cpp
)中分配它们。
答案 2 :(得分:1)
它与联系无关。
静态常量,在其声明中指定的值,可用作常量表达式,并且不需要该用法的定义。
静态变量确实需要定义,如果它们不是常量(因此值需要存储在某个运行时)或者它们是 odr-used (粗略地说,如果你拿它们的地址或形成对它们的引用,这也意味着它们需要在运行时存在于某处。)