C++ 在头文件中声明符号常量而不初始化?
通常在头文件中定义符号常量:C++ 在头文件中声明符号常量而不初始化?,c++,constants,compile-time-constant,constant-expression,C++,Constants,Compile Time Constant,Constant Expression,通常在头文件中定义符号常量: #define T_FOO 1 #define T_BAR 2 丑陋的 更好,因为不是预处理器 enum { T_FOO = 1, T_BAR } T_Type; 更好的是,因为T_Type携带目的信息,并且编译器可以进行额外的检查(例如,如果所有情况都在开关中处理) 可能还有六种变种。但有一件事。。。它们都向客户披露数值。我想隐藏这些值,只是因为它们不重要。但我能想到的唯一方法 typedef int T_Type; // defined e
#define T_FOO 1
#define T_BAR 2
丑陋的
更好,因为不是预处理器
enum
{
T_FOO = 1,
T_BAR
} T_Type;
更好的是,因为T_Type
携带目的信息,并且编译器可以进行额外的检查(例如,如果所有情况都在开关中处理)
可能还有六种变种。但有一件事。。。它们都向客户披露数值。我想隐藏这些值,只是因为它们不重要。但我能想到的唯一方法
typedef int T_Type;
// defined elsewhere
extern const T_Type T_FOO;
extern const T_Type T_BAR;
…不适用于例如case
语句(因为T_FOO
和T_BAR
是常量,但不是编译时常量表达式)
有没有一种方法可以拥有一切
- 在标头中声明符号常量而不公开数值
- 但是可以作为常量表达式使用,例如在
switch
语句中
我的理解水平是“不”,但我知道我不知道一切 要在asswitch
语句标签中使用,编译器必须在此翻译单元的源代码中查看这些值
因此,本质上,不,您不能在不公开其值的情况下声明符号常量,并将其用作开关中的标签
但是,您可以使用if
-else
构造。您可以将映射到T_类型的方法/函数指针保存在某个地方,但是,是的,这只是解决了一个不值得创建的问题-硬编码逻辑只能使用硬编码值。您的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;
你想对人类读者而不是编译器隐藏这些值吗?@n.m.:基本上,是的。(现在你们这么说,听起来太愚蠢了。;-)在编译程序之前,在替换数值常量的地方进行预处理。因此,即使你混淆了常量,它们也会在预处理中被替换,每个人都会知道这些常量是什么,你有权访问C++11吗?因为如果你这样做,你应该使用constexpr
来指定一个值是编译时常量,我希望在实现中隐藏一些复杂的东西,只留下一个没有技术细节的原始头。但你似乎不能既有蛋糕又吃。Ty.谢谢,修复了,但没有解决这个问题。>>在标题中声明符号常量而不披露数值(是)>>可作为常量表达式使用,例如在switch语句中(是)可作为常量表达式使用,例如在switch语句中(仅在转换单元中定义)。
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;