在头文件中声明符号常量而不初始化

Declaring symbolic constants in header without initializing?

本文关键字:初始化 符号常量 声明 文件      更新时间:2023-10-16

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

#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语句?

我的理解水平说"不",但我知道我不是什么都知道。: -)

为了在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;