tak0kadaの何でもノート

発声練習、生存確認用。

医学関連は 医学ノート

C++コンパイラの名前修飾

コンパイラは最終的にはバイナリの実行ファイルを生成するわけだが、少なくともCやC++の場合は分割コンパイルができるので複数のオブジェクトファイルをリンカで結びつけることになっている。リンカはC言語の形式でしか名前を処理できないので、コンパイラC++の場合でもマングリングと呼ばれるC言語形式への書き換え処理を行ってくれている。

大まかなルールはwikipediaによると、

修飾された名前は全て _Z で始まる。下線に大文字を続けたものはCおよびC++では予約語であることに注意されたい。従って、ユーザの識別子とぶつかることはない。ネストされた名前は(名前空間、クラス両者)、Nをつけ、次いで <長さ,id> のペアをつけて示す(「長さ」は次の識別子の長さ)。最後にEを付ける。

とある。std::basic_filebuf<char, std::char_traits<char>>::~basic_filebuf()から_ZNSt13basic_filebufIcSt11char_traitsIcEED1Evが生成されるのを見るに、多少順番は前後するが、

std :: basic_... < char std :: char_traits < char > > :: ~basic_... ()
_ZN St 13basic... I(l1) c St 11char_... I(l2) c E(←l2) E(←l1) D1 E(←_ZN) v(void)

実際の規則はとても複雑である。。。*1

参考