2016-02-05 48 views
0

假設我已經寫了以下內容:我可以使用它們的標識符來取消枚舉嗎?

enum class Color { Red, Green, Blue, }; 
template <Color c> Color foo() { return c; } 
template Color foo<Color::Green>(); 

並編譯它。當我看到我的編譯代碼的objdump的,我得到:

[[email protected] /tmp]$ objdump -t f.o | grep "\.text\." | sed 's/^.*\.text\.//;' | c++filt 
Color foo<(Color)1>() 
Color foo<(Color)1>() 000000000000000b Color foo<(Color)1>() 

如果我使用abi::__cxa_demangle()<cxxabi.h>(GCC,也許是你的編譯器不同),這也是相似 - (Color)0Color)1是模板參數,而不是RedGreenColor::RedColor::Green

顯然,我不能讓名字受到我喜歡的方式的影響。但是 - 我真的很希望能夠獲得(或寫?)的demangling呼叫,而不是"Color foo<(Color)1>()"回報"Color foo<(Color:Green>()"(或"Color foo<(Green>()"這是這是可行的變體

+0

@SeverinPappadeux:見我的編輯。 – einpoklum

+0

請檢查答案 –

回答

0

這可能與調試信息的目標文件是可能的? - section .debug_info包含有關enum class Color的信息,它需要一些工具來讀取ELF調試信息,語義解析數據並將信息應用/傳遞給C++ filt。我不知道這些工具是否存在(也許,在GDB它都粘在一起)

這是幾乎不可能的一般與目標文件編譯優化,或剝離調試信息 - 關於enum class Color只是沒有信息...

從優化的建立

objdump -s aaa.o 

aaa.o:  file format pe-x86-64 

Contents of section .text$_Z3fooIL5Color1EES0_v: 
0000 554889e5 b8010000 005dc390 90909090 UH.......]...... 
Contents of section .xdata$_Z3fooIL5Color1EES0_v: 
0000 01040205 04030150     .......P 
Contents of section .pdata$_Z3fooIL5Color1EES0_v: 
0000 00000000 0b000000 00000000   ............ 
Contents of section .rdata$zzz: 
0000 4743433a 20287838 365f3634 2d706f73 GCC: (x86_64-pos 
0010 69782d73 65682d72 6576302c 20427569 ix-seh-rev0, Bui 
0020 6c742062 79204d69 6e47572d 57363420 lt by MinGW-W64 
0030 70726f6a 65637429 20352e33 2e300000 project) 5.3.0.. 

調試版本有部分.debug_info的部分內容:

0070 00000000 00000000 00000002 436f6c6f ............Colo 
0080 720004a3 00000001 01a30000 00035265 r.............Re 
0090 64000003 47726565 6e000103 426c7565 d...Green...Blue 
00a0 00020004 0405696e 74000566 6f6f3c28 ......int..foo<(
00b0 436f6c6f 7229313e 0001065f 5a33666f Color)1>..._Z3fo 
00c0 6f494c35 436f6c6f 72314545 53305f76 oIL5Color1EES0_v 
00d0 007b0000 00000000 00000000 000b0000 .{.............. 
00e0 00000000 00019c06 63007b00 00000100 ........c.{..... 
00f0 00 
相關問題