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
    语句中

我的理解水平是“不”,但我知道我不知道一切

要在as
switch
语句标签中使用,编译器必须在此翻译单元的源代码中查看这些值

因此,本质上,不,您不能在不公开其值的情况下声明符号常量,并将其用作
开关中的标签


但是,您可以使用
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;