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をこのように翻訳しています.
structでもclassでもTsで識別されます.しかしmsvcはclassとstructをこのように翻訳しています.
structとclassはそれぞれ異なるアルファベットで表記されています.Linkerレベルでは、違うものが見えます.[顔を覆う]
差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レベルでは、違うものが見えます.[顔を覆う]