Visual C++(MSVC)でC/C++コードをコンパイルすると、文字列定数は例えば下記のようにマングリングされます。
" %u: wFuncFlags: 0x%08X<%s>\n"
↓
??_C@_0BN@OHAHGLIK@?5?$CFu?3?5wFuncFlags?3?50x?$CF08X?$DM?$CFs?$DO?6@
ASCII部分が辛うじて読み取れますが、訳がわからない文字列です。
このマングリングされたシンボル名をUnDecorateSymbolName
関数でデマングリングすると、素っ気なく``string'`とだけ返ってきます。
復元できそうなので、大変もどかしいです。
そこでデマングリングする方法を調べたところ、下記で言及されてました。
Visual C++ name mangling
どうやら、@
で分割して(1つ目は特殊)
-
_C@_0
で始まればシングルバイト文字、_C@_1
で始まればマルチバイト文字 - その次に文字列長(エンコードされている)
- なんかわからんハッシュみたいな文字
- ルールに従ってエンコーディングされた文字列
になっているようです。
ではそれを実装しましょう。
したものがこちらです。
試してみると、ほぼうまくいってそうですが、\n
がVT(垂直タブ)になってしまっていますね。
もとの表で、{ctrl-K}{ctrl-J}
が逆の気がします。
まぁそこを直せば使えるんじゃないでしょうか。