有沒有一種快速輸出枚舉值名稱的方法?我想你知道我的意思,並且完全不可能,因爲在編譯過程中所有這些數據都變得無關緊要,但是我在調試模式下使用MSVC,所以可能嗎?MSVC枚舉調試
MSVC枚舉調試
回答
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";
}
}
不同的「擴展宏」,可以使用填寫您選擇的地圖或其他數據結構。我用這種恐怖來解析配置文件中的枚舉(所以編寫配置文件的人可以使用枚舉而不是索引)。
不幸的不是。所有的枚舉名都被編譯器丟失了。 PDB文件有它們,所以調試器可以解決它,但否則唯一的方法就是編寫一個執行切換並返回字符串的函數。
「PDB文件有他們」:如何訪問它們? – 2010-04-29 18:35:29
我不知道它的名字,但有一個圖書館,你可以鏈接到從PDB獲取信息。 – 2010-04-29 18:42:02
這是「調試接口訪問SDK」(http://msdn.microsoft.com/en-us/library/x93ctkx8.aspx) – 2010-04-29 18:52:33
我只是將枚舉名稱放在查找表中(或者您可以使用map<>
)並將枚舉值作爲關鍵字並且有一個函數執行查找。
這是低科技,但通常不會太痛苦。
在一些項目中,我有一個奇怪的頭/宏安排,可以使用每個枚舉名的單個聲明類項來構建枚舉定義。我對這種技術如何在「方便」或「雜亂」之間來回擺動的看法。
這就是我試圖避免:) – 2010-04-29 18:34:39
這是常見的C++問題,即使用「Typesafe枚舉模式」解決。通常這是使用一些瘋狂的預編譯器定義或代碼生成器完成的。快速搜索「Typesafe enum pattern C++」可以爲您提供這些方法。就我個人而言,我有我自己的C++枚舉的代碼生成器,它作爲MSVC自定義生成步驟執行,用於具有枚舉的h文件。
注意:你有1,337代表。 – 2010-04-29 18:44:44
@oh boy:注意!我不會upvote然後.. :-P – Macke 2010-04-29 18:46:19
@男孩,馬庫斯Lindblom - 你是什麼意思? – 2010-04-29 18:52:33
- 1. MSVC常量枚舉類型
- 2. 在枚舉枚舉中調用.Distinct()
- 3. 調試例程MSVC++特定?
- 4. 嘗試在C#枚舉
- 5. 「枚舉類」仿真或固體替代的MSVC 10.0
- 6. 用於指定C枚舉大小的GCC/Clang/MSVC擴展?
- 7. 帶枚舉的MySQL枚舉
- 8. Java枚舉找到枚舉
- 9. Java類枚舉枚舉類
- 10. 在枚舉中枚舉
- 11. 轉換枚舉來枚舉
- 12. 重新枚舉枚舉
- 13. 在調整枚舉列表
- 14. Groovy枚舉 - 調用鏈
- 15. 試圖測試枚舉的方法
- 16. 在枚舉語句中枚舉mysql枚舉
- 17. 枚舉
- 18. 枚舉
- 19. 枚舉
- 20. 枚舉
- 21. 枚舉
- 22. 爪哇枚舉和Objective-C枚舉
- 23. 與protobuf的枚舉替換C++枚舉
- 24. Java的枚舉和PostgreSQL枚舉
- 25. 獲取枚舉併發送枚舉值
- 26. Node.js native枚舉中的枚舉類型
- 27. 是枚舉Java中的枚舉
- 28. 爲什麼枚舉包括可枚舉
- 29. 將枚舉映射到「子枚舉」
- 30. 如何在保持枚舉枚舉
這可能不是你想要的,但是是一個不同的方法來解決問題。如果您生成PDB,讀取PDB就沒有問題,但如果您要分發代碼並打算以某種方式自動在UI中使用枚舉值,則需要使用不同的解決方案。 – 2010-04-29 18:43:15