c++ - 在哪里定义编译时常量?
问题描述
我做了一个超级简单的设计来开始解决问题。
现在,起初这可能看起来非常微不足道,但由于有很多方法可以做到这一点,由于我缺乏专业经验,这让我感到困惑。
我将在哪里定义这些编译时间常量?(总是假设我使用的是当前最高的 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++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;
}
推荐阅读
- javascript - 从回调中在主线程中抛出值错误
- c# - 提高 Xamarin 表单渲染性能
- r - 如何更改标题名称出现在 R 的森林图中?
- php - 如何使用 JSON 作为数据类型调试 jQuery.post()?
- google-bigquery - 用固定值替换 NULL,而不创建新列 BigQuery
- elasticsearch - elasticsearch CCR 功能是否复制 ILM?
- ruby - 有没有办法使用 Factory Bot 从同一资源创建不同的工厂?
- spring-boot - java.sql.SQLException:无法使用 JDBC Uri 打开客户端传输
- node.js - 如何使用新的 RVT->SVF Model Derivative 参数来生成额外的内容,包括房间和空间?
- javascript - 映射数组后,如何在 Vertical-Timeline 中返回徽标组件?反应