在没有初始化的情况下在标题中声明符号常量?

时间:2014-05-06 08:40:35

标签: c++ const constants compile-time-constant constant-expression

通常的做法是在头文件中定义符号常量:

#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_FOOT_BAR是常量,但不是编译时常量表达式。)

有办法拥有一切吗?

  • 在不透露数值的情况下在标题中声明符号常量,
  • 但可用作常量表达式,例如在switch陈述中?

我的理解水平说“不”,但我知道我不知道一切。 ; - )

3 个答案:

答案 0 :(得分:2)

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

基本上, no ,你不能在不透露其值的情况下声明符号常量,并将它们用作switch中的标签。

但是,您可以使用if - else构造。

答案 1 :(得分:0)

你可以在某处保存映射到T_Type的方法/函数指针,但是,它只是解决问题,而不是首先值得创建 - 硬编码逻辑只能与硬编码一起使用值。

答案 2 :(得分:0)

你的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;