2019-06-14 StructとClassの違い

1735 ワード

参考資料:安騰C++ABIドキュメント(gcc/clang):https://itanium-cxx-abi.github.io/cxx-abi/安騰C++ABIコード:https://github.com/microsoft/clang/blob/master/lib/AST/Mangle.cppマイクロソフトC++ABIドキュメント(非公式):https://en.wikiversity.org/wiki/Visual_C%2B%2B_name_manglingマイクロソフトC++ABIコード:https://github.com/microsoft/clang/blob/master/lib/AST/MicrosoftMangle.cppWikiの概要:https://en.wikipedia.org/wiki/Name_mangling
差NameManglingの補完.
現象:関数が実現したのに、linkerに関数が見つからないと告げられた.関数のパラメータには(A*foo)が使用され、Aは前に宣言されたClassまたはStructです.前置き宣言は、Aのタイプはstructですが、定義時にAはclassです.Aの真のアイデンティティはclassですが、関数はstructポインタのパラメータが必要だと考えています.C++におけるClassとStructに関するネット上の論述は,可視性(public,private)以外は同じである.しかし、マイクロソフトにとって、このXXは薄っぺらです.
gcc/clangはclassとstructをこのように翻訳しています.
   ::=      # non-dependent type name, dependent type name, or dependent typename-specifier
                    ::= Ts   # dependent elaborated type specifier using 'struct' or 'class'
                    ::= Tu   # dependent elaborated type specifier using 'union'
                    ::= Te   # dependent elaborated type specifier using 'enum'

structでもclassでもTsで識別されます.しかしmsvcはclassとstructをこのように翻訳しています.
void MicrosoftCXXNameMangler::mangleTagTypeKind(TagTypeKind TTK) {
  switch (TTK) {
    case TTK_Union:
      Out << 'T';
      break;
    case TTK_Struct:
    case TTK_Interface:
      Out << 'U';
      break;
    case TTK_Class:
      Out << 'V';
      break;
    case TTK_Enum:
      Out << "W4";
      break;
  }
}

structとclassはそれぞれ異なるアルファベットで表記されています.Linkerレベルでは、違うものが見えます.[顔を覆う]