首页 > 解决方案 > 在哪里定义编译时常量?

问题描述

我做了一个超级简单的设计来开始解决问题。

在此处输入图像描述

现在,起初这可能看起来非常微不足道,但由于有很多方法可以做到这一点,由于我缺乏专业经验,这让我感到困惑。

我将在哪里定义这些编译时间常量?(总是假设我使用的是当前最高的 C++ 标准版本)

在命名空间中?课堂内?在课外的 .h 中?在课外的 .cpp 中?只是将它们用作幻数并添加一些评论?静止的?非静态的?常量?常量表达式?模板甲板尺寸以防它更大?

我想到的:

class JolloManager
{
private:
    constexpr static int rounds = 3;
    constexpr static int deckSize = 52;
    constexpr static int princeId = 1;
    constexpr static int princessId = 2;
    std::array<int, deckSize> deck;
public:
    JolloManager() {};
};

它是否正确?

标签: c++c++17compile-time-constant

解决方案


在 C++17 中,定义编译时整数常量很容易。

首先,您应该决定是否应该将常量限定为一个类。如果将其作为类成员有意义(例如,它与类所代表的概念有关),则使其成为类成员。否则,不要。

作为班员,写:

class JolloManager {
    constexpr static int rounds = 3;
};

就是这样。在 C++17 中不再需要离线定义。

如果它不是类成员,但您希望包含您的标头的每个人都能够访问该值,请在标头中写入:

inline constexpr int rounds = 3;

(从技术上讲,使用的原因inline是当变量被多个翻译单元中的内联函数使用 ODR 时避免 ODR 违规。)

如果该值是只有一个.cpp文件需要访问的实现细节,则在该.cpp文件中写入以下内容以提供内部链接(即,防止与其他翻译单元中的名称冲突):

constexpr int rounds = 3;  // no `inline` this time

最后,如果该常量仅由单个函数需要,您可以将其设置为该函数的局部变量:

void foo() {
    constexpr int rounds = 3;
}

推荐阅读