1

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

#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带有目的信息,并且编译器可以进行额外的检查(例如,如果所有情况都在 a 中处理switch)。

可能还有六种变种。不过有一件事......他们都向客户披露了数值。我想隐藏这些值,只是因为它们不重要。但是我能想到的一种方法...

typedef int T_Type;

// defined elsewhere
extern const T_Type T_FOO;
extern const T_Type T_BAR;

...不适用于 egcase语句(作为T_FOOT_BAR是常量,但不是编译时常量表达式)。

没有办法拥有这一切?

  • 在标题中声明符号常量而不透露数值,
  • 但可用作常量表达式,例如在switch语句中?

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

4

3 回答 3

2

为了可用作switch语句标签,编译器必须在此翻译单元的源代码中更早地看到这些值。

所以本质上,,你不能在不公开它们的值的情况下声明符号常量,并将它们用作 a 中的标签switch

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

于 2014-05-06T08:45:52.953 回答
0

You can hold method/function pointers mapped to T_Type somewhere, but yep, it's all just hacks out of problem which don't worth to be created in first place - hardcoded logic can only work with hardcoded values.

于 2014-05-06T09:09:57.733 回答
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;
于 2014-05-06T09:16:15.513 回答