コンパイラによる名前修飾の相違
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/11/26 23:58 UTC 版)
「名前修飾」の記事における「コンパイラによる名前修飾の相違」の解説
C++では、ささいな識別子ですら、名前修飾の標準スキームは存在しない。そのため、コンパイラベンダによって、あるいは同じコンパイラでも版によって、更に場合によっては同じ版でもプラットフォームによって全く異なった、互換性のない方法をとることになる。同じ関数について、その違いを見てみよう。 コンパイラvoid h(int)void h(int, char)void h(void)clang 1.x _Z1hi _Z1hic _Z1hv GNU GCC 3.x _Z1hi _Z1hic _Z1hv GNU GCC 2.9x h__Fi h__Fic h__Fv Intel C++ 8.0 for Linux _Z1hi _Z1hic _Z1hv Microsoft VC++ v6/v7 ?h@@YAXH@Z ?h@@YAXHD@Z ?h@@YAXXZ Borland C++ v3.1 @h$qi @h$qizc @h$qv OpenVMS C++ V6.5 (ARM mode) H__XI H__XIC H__XV OpenVMS C++ V6.5 (ANSI mode) CXX$__7H__FI0ARG51T CXX$__7H__FIC26CDH77 CXX$__7H__FV2CB06E8 OpenVMS C++ X7.1 IA-64 CXX$_Z1HI2DSQ26A CXX$_Z1HIC2NP3LI4 CXX$_Z1HV0BCA19V Digital Mars C++ ?h@@YAXH@Z ?h@@YAXHD@Z ?h@@YAXXZ SunPro CC __1cBh6Fi_v_ __1cBh6Fic_v_ __1cBh6F_v_ HP aC++ A.05.55 IA-64 _Z1hi _Z1hic _Z1hv HP aC++ A.03.45 PA-RISC h__Fi h__Fic h__Fv Tru64 C++ V6.5 (ARM mode) h__Xi h__Xic h__Xv Tru64 C++ V6.5 (ANSI mode) __7h__Fi __7h__Fic __7h__Fv 註: OpenVMS VAX、DEC Alpha(IA-64を除く)及び Tru64 UNIX 上のCompaq C++ コンパイラは二種類の修飾スキームを持っている。標準化前のもともとのスキームは ARM モデルとして知られていた。これは『The Annotated C++ Reference Manual (ARM)』(邦訳『注解C++リファレンスマニュアル』)に記述された方法を元にしている。標準C++の機能拡充、特にテンプレート機能の追加に伴い、ARM は次第に旧式化していった — ある種の関数型をエンコードできず、異なった関数に異なったシンボル名を割り当てることができなくなっていた。そこで、より新しい ANSI モデルが導入され、ANSIテンプレート機能が全て利用可能になったが、過去の版との互換性は失われた。todo: the different isn't obvious from the examples. maybe a template or something should be added... IA-64にはアプリケーションバイナリインタフェース (ABI) 標準の名前修飾規則(Itanium C++ ABI mangling)が存在する(#外部リンク参照)。これは標準的な名前修飾スキームを定義したものであり、全てのIA-64コンパイラで利用されている。加えて、GNU GCC 3.xもこの標準を用いている。インテル環境以外でも利用することができる。
※この「コンパイラによる名前修飾の相違」の解説は、「名前修飾」の解説の一部です。
「コンパイラによる名前修飾の相違」を含む「名前修飾」の記事については、「名前修飾」の概要を参照ください。
- コンパイラによる名前修飾の相違のページへのリンク