2010-04-29 61 views
2

有沒有一種快速輸出枚舉值名稱的方法?我想你知道我的意思,並且完全不可能,因爲在編譯過程中所有這些數據都變得無關緊要,但是我在調​​試模式下使用MSVC,所以可能嗎?MSVC枚舉調試

回答

1

Metamacros造成智能感知等的各種破壞,但他們可以讓這個任務很容易...

#define MY_ENUMS(e_) \ 
    e_(Enum_A), \ 
    e_(Enum_B), \ 
    e_(Enum_C), \ 

#define ENUM_EXPANDER(e_) e 
enum MyEnums 
{ 
    MY_ENUMS(ENUM_EXPANDER) 
    CountOfMyEnums 
}; 

#define STRING_EXPANDER(e_) #e_ 
const char* g_myEnumStrings[] = 
{ 
    MY_ENUMS(STRING_EXPANDER) 
}; 

甚至可能

#define CASE_EXPANDER(e_) case e_: return #e_; 
const char* GetEnumName(MyEnums e) 
{ 
    switch (e) 
    { 
     MY_ENUMS(CASE_EXPANDER) 

    default: 
     return "Invalid enum value"; 
    } 
} 

不同的「擴展宏」,可以使用填寫您選擇的地圖或其他數據結構。我用這種恐怖來解析配置文件中的枚舉(所以編寫配置文件的人可以使用枚舉而不是索引)。

+0

這可能不是你想要的,但是是一個不同的方法來解決問題。如果您生成PDB,讀取PDB就沒有問題,但如果您要分發代碼並打算以某種方式自動在UI中使用枚舉值,則需要使用不同的解決方案。 – 2010-04-29 18:43:15

0

不幸的不是。所有的枚舉名都被編譯器丟失了。 PDB文件有它們,所以調試器可以解決它,但否則唯一的方法就是編寫一個執行切換並返回字符串的函數。

+0

「PDB文件有他們」:如何訪問它們? – 2010-04-29 18:35:29

+0

我不知道它的名字,但有一個圖書館,你可以鏈接到從PDB獲取信息。 – 2010-04-29 18:42:02

+0

這是「調試接口訪問SDK」(http://msdn.microsoft.com/en-us/library/x93ctkx8.aspx) – 2010-04-29 18:52:33

1

我只是將枚舉名稱放在查找表中(或者您可以使用map<>)並將枚舉值作爲關鍵字並且有一個函數執行查找。

這是低科技,但通常不會太痛苦。

在一些項目中,我有一個奇怪的頭/宏安排,可以使用每個枚舉名的單個聲明類項來構建枚舉定義。我對這種技術如何在「方便」或「雜亂」之間來回擺動的看法。

+0

這就是我試圖避免:) – 2010-04-29 18:34:39

1

這是常見的C++問題,即使用「Typesafe枚舉模式」解決。通常這是使用一些瘋狂的預編譯器定義或代碼生成器完成的。快速搜索「Typesafe enum pattern C++」可以爲您提供這些方法。就我個人而言,我有我自己的C++枚舉的代碼生成器,它作爲MSVC自定義生成步驟執行,用於具有枚舉的h文件。

+0

注意:你有1,337代表。 – 2010-04-29 18:44:44

+0

@oh boy:注意!我不會upvote然後.. :-P – Macke 2010-04-29 18:46:19

+0

@男孩,馬庫斯Lindblom - 你是什麼意思? – 2010-04-29 18:52:33