在头文件中声明符号常量而不初始化
Declaring symbolic constants in header without initializing?
通常的做法是在头文件中定义符号常量:
#define T_FOO 1
#define T_BAR 2
丑陋。
static const int T_FOO = 1;
static const int T_BAR = 2;
更好,因为没有预处理器。
enum
{
T_FOO = 1,
T_BAR
} T_Type;
更好的是,因为T_Type
携带了目的信息,编译器可以做额外的检查(例如,如果所有的情况都在switch
中处理)。
可能还有六种变体。不过有一件事……它们都向客户披露数值。我想把这些值隐藏起来,因为它们不重要。但我能想到的一种方法是…
typedef int T_Type;
// defined elsewhere
extern const T_Type T_FOO;
extern const T_Type T_BAR;
…不能用于例如case
语句(因为T_FOO
和T_BAR
是常量,但不是编译时常量表达式)。
有办法拥有这一切吗?
- 在头文件中声明符号常量而不公开数值,
- 但可用作常量表达式,例如在
switch
语句?
我的理解水平说"不",但我知道我不是什么都知道。: -)
为了在switch
语句标签中可用,编译器必须在这个翻译单元的源代码中看到这些值。
所以本质上,没有,你不能声明符号常量而不公开它们的值,并将它们用作switch
中的标签。
但是,您可以使用if
- else
结构
你可以把方法/函数指针映射到T_Type的某个地方,但是,是的,这一切都只是为了解决问题,不值得首先创建-硬编码逻辑只能与硬编码值一起工作。
您的typedef声明错误。这个怎么样?
typedef int T_Type;
// defined elsewhere
extern const T_Type T_FOO;
extern const T_Type T_BAR;
// elsewhere defined as, say
const T_Type T_FOO = 1;
const T_Type T_BAR = 2;
相关文章:
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 具有聚合初始化的C++常量匿名实例
- 如何初始化具有常量变量的结构数组
- 为什么作为返回类型的右值引用不能初始化非常量引用?
- 从另一个常量标准::映射初始化一个常量标准::映射的一部分
- 大括号使用枚举类初始化静态常量unordered_map
- 错误 C2864:'element::next':只能在类 (STRUCT) 中初始化静态常量整数数据成员
- 我应该使用类内发起器初始化静态常量数据成员还是在其类外的定义中初始化静态常量数据成员
- 与其他静态const成员初始化静态常量成员
- 用整数值初始化非常量参考
- 使用 constexpr 初始化非常量静态字符串
- 引用初始化和常量表达式
- 从右值初始化非常量引用
- 从右值初始化非常量引用无效
- 无法初始化静态常量字符串
- 引用由T以外类型的值初始化的常量T
- 在 c++ 中初始化静态常量数组
- 是否将类初始化的常量成员传递给基构造函数
- 类中只能初始化静态常量积分数据成员
- 如何初始化静态常量向量