簡體   English   中英

在標頭中聲明符號常量而不進行初始化?

[英]Declaring symbolic constants in header without initializing?

通常在頭文件中定義符號常量:

#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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM