2017-06-19 126 views
-2

我已經定義了一些宏是這樣的:有沒有簡單的方法將值轉換爲字符串?

#define ABC '1' 
#define DEF '2' 
#define XYZ '3' 

而且我也需要輸出宏字符串基於其價值,就像這樣:

static const char* get_event_string(unsigned char event) 
{ 
    switch (event) { 
     case '1': 
      return "ABC"; 
     case '2': 
      return "DEF"; 
     case '3': 
      return "XYZ"; 
    } 
} 

有沒有什麼簡單的方法來做到這一點?

+0

看起來很簡單。你試圖達到什麼目的? – Yunnosch

+2

你爲什麼在你的case語句使用''1''當你有完全可用'#define''d標籤設置? –

+0

足夠關閉,如果你不介意使用枚舉代替:https://stackoverflow.com/questions/9907160/how-to-convert-enum-names-to-string-in-c – HolyBlackCat

回答

1

你有什麼已經是一種常見的方式來做到這一點。我建議保持這種方式,實際上使用您的宏在case聲明,而不是魔術字符 s。

如果你的價值觀是連續的,你也可以使用一個查找表是這樣的:

static const char *get_event_string(unsigned char event) 
{ 
    static const char *const names[] = { 
     "ABC", 
     "DEF", 
     "XYZ" 
    }; 
    return names[event - '1']; 
} 

兩種方法假定函數永遠不會調用的參數無效。


如果您可以將事件的值更改爲自然數,例如,

#define ABC 1 
#define DEF 2 
#define XYZ 3 

,或者甚至使用enum

enum event 
{ 
    EV_NONE, 
    EV_ABC, 
    EV_DEF, 
    EV_XYZ 
}; 

然後查找表纔會有真正的好處是,你不需要任何的功能更多。只需把它定義(如對上述enum爲例):

const char *const event_strings[] = { 
    "EV_NONE", 
    "EV_ABC", 
    "EV_DEF", 
    "EV_XYZ" 
}; 

和所有您需要在代碼中寫訪問的名字是event_strings[event]

做這方式甚至使您可以使用預處理程序自動定義匹配的表到您的enum像顯示在this answer

+0

冗餘太多,容易出錯。最少的是爲陣列使用指定的初始值。而且,因爲您已經使用函數來檢索數據,所以將表移動到函數範圍並將表本身設爲const也會更好。 – Olaf

+0

嗯,我不會在我的代碼中使用*數字字符*作爲ID,首先。也許我會編輯這個以顯示(恕我直言)最好的方式,當你只使用自然數作爲ID ... –

+0

是的,這是whatr'enum's通常是好的。 – Olaf

2

一定要先看看這個罰款答案:How to convert enum names to string in c


如果基於各種常數不符合您的需求,計算的指數。

如果常量ABC,DEF,XYZ是唯一的,任意的(例如,也許不是連續的),並固定在恆定計數(3),可以使用一個公式,並讓編譯器優化。

const char* get_event_string(unsigned char event) { 
    int index = (event == ABC)*1 
      | (event == DEF)*2 
      | (event == XYZ)*3; 
    static const char *event_string[4] = { "None", "ABC", "DEF", "XYZ" }; 
    return event_string[index]; 
} 
+0

嗯,當然這比讓編譯器優化'switch .. case'更好嗎?我覺得它不太可讀,但這可能是一個品味問題。 –

+0

@FelixPalmen好點。沒有提示在發射代碼中這比「switch .. case」更好。根據OP的需要,這可以將'event_string []'作爲一個可能更容易維護的數組。當然可以編寫'case'1':return event_string [1]; case'2': return event_string [2]; ...... IMO最好的代碼是清晰的,使用'switch ... case'通常足夠清晰,但OP的需求可能與我的經驗不同。 – chux

+0

不應該擔心10-20個字符串,但不會記錄(n)範圍比較優於n個相等性檢查嗎? –

相關問題