鉴于您对情况的描述,我会说使用static const
成员是一种好方法。在 C++11 中,您可能希望将其更改为static constexpr
以强调它是编译时常量,尽管不会因此而有效地改变任何内容。
如果您以myclass::kMyClassContant_
在单一定义规则 (odr) 下相关的方式引用代码中的某处,尤其是。在需要引用(包括 const-reference)的上下文中,编译器会抱怨没有定义常量。在这种情况下,仅仅在类中声明和初始化它是不够的。这可能会迫使您将声明和定义分开:
// mycode.h
class myclass {
private:
static const uint16_t kMyClassConstant_;
};
// mycode.cpp
const uint16_t myclass::kMyClassConstant_ = 0xBEEF;
为了避免维护单独的声明和定义的麻烦,有些人更喜欢声明内联 constexpr 函数而不是实际变量:
// mycode.h
class myclass {
private:
static constexpr uint16_t kMyClassConstant_()
{ return 0xBEEF; }
};
对于许多与 odr 相关的问题,这是一种正确的解决方法,并且不会导致任何性能损失。它是否真的有用取决于维护普通静态常量的单独声明和定义的负担有多大。如果您希望常量永远不会随着代码的发展而改变,那么最好使用具有单独定义的普通静态常量。但是,如果您经常修改常量的定义,则必须重新编译定义文件并将其重新链接到项目的所有相关部分可能会使您认为上述基于函数的解决方案是更好的选择。
关于数据类型的最后评论:std::uint16_t
如果您需要以紧凑的形式存储大量这些值,则使用强制将其转换为 16 位可能很有用。否则,实际大小可能并不重要,在这种情况下std::uint_fast16_t
(可能大于 16 位)可能会更好。