删除constexpr会改变链接吗?

时间:2014-08-18 14:45:46

标签: c++ static constexpr linkage

我在头文件中定义了一个简单的配置结构,其中包含一系列其他简单结构,这些结构只是静态变量的容器。这是一个例子:

// 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对象的链接不同吗?还有其他我想念的东西吗?

3 个答案:

答案 0 :(得分:1)

您缺少非constexpr成员的定义。在.cpp文件中你需要有例如。

int Config::width;

答案 1 :(得分:1)

constexpr成员隐式内联,因此无需定义。一旦它们是适当的变量,您需要在翻译单元(.cpp)中分配它们。

答案 2 :(得分:1)

它与联系无关。

静态常量,在其声明中指定的值,可用作常量表达式,并且不需要该用法的定义。

静态变量确实需要定义,如果它们不是常量(因此值需要存储在某个运行时)或者它们是 odr-used (粗略地说,如果你拿它们的地址或形成对它们的引用,这也意味着它们需要在运行时存在于某处。)