関数の場合は、続いて型情報が付加される。関数なので、単にvを付ける。よって、_ZN·9wikipedia·7article·6format·E·vとなる。よって、この型に対する参照はRSoとなる。名前の完成形はこうなる。_ZN·9wikipedia·7article·8print_to·E·RSoコンパイラによる名前修飾の相違[編集]C++では、ささいな識別子ですら、名前修飾の標準スキームは存在しない。そのため、コンパイラベンダによって、あるいは同じコンパイラでも版によって、更に場合によっては同じ版でもプラットフォームによって全く異なった、互換性のない方法をとることになる。同じ関数について、その違いを見てみよう。コンパイラは二種類の修飾スキームを持っている。モデルとして知られていた。(ARM)』(邦訳『注解C++リファレンスマニュアル』)に記述された方法を元にしている。ある種の関数型をエンコードできず、異なった関数に異なったシンボル名を割り当てることができなくなっていた。モデルが導入され、ANSIテンプレート機能が全て利用可能になったが、過去の版との互換性は失われた。mangling)が存在する(#外部リンク参照)。これは標準的な名前修飾スキームを定義したものであり、全てのIA-64コンパイラで利用されている。3.xもこの標準を用いている。インテル環境以外でも利用することができる。__cplusplus}#endifは、引き続くシンボルを修飾しないことを指示する。コンパイラはあたかもCコンパイラであるかのように、修飾なしの名前を用いたバイナリを吐く。Cが名前修飾を利用していないので、C++コンパイラもそれらの識別子を参照する際名前修飾を避けなければならない。libc)には存在しないので、リンカはエラーを報告することになる。C++での名前修飾の標準化[編集]C++で名前修飾の標準化を行うと、実装をまたいだ運用がしやすくなるというのが比較的広く信じられているが、これは実際には正しくない。他の細かな言語仕様(例外処理、仮想テーブルのレイアウト、構造体のパディングなど)におけるいくつかの問題の一つに過ぎず、名前修飾だけをどうかしても非互換性は残ることになる。特定の修飾法を決めてしまうと、実装が制限されるシステムが出現しうる(例えば、シンボルの長さ)。名前修飾を標準化してしまうと、例えばC++の文法を理解できるリンカのような、名前修飾を必要としない実装を妨げる可能性もある。して、名前修飾を標準化することを特に目指してはいない。7.2.1c)では、ABI上の他の非互換性を抱えたモジュールを誤ってリンクしないように、異なった名前修飾法を用いることが推奨されている。C++名前修飾問題の現実的な影響[編集]C++のシンボルはDLLや共有オブジェクトを通してルーチン的にエクスポートされるため、名前修飾スキームはコンパイラの問題だけではすまなくなる。ライブラリをコンパイルするにあたって、複数のコンパイラ(場合によっては、同じコンパイラでも版が異なるだけで問題になりうる)によって名前修飾がそれぞれ異なったスキームで行われると、それらのライブラリを参照する際、しばしばシンボルが解決できなくなってしまう。OSベンダのコンパイラとGCCで。ABIでの重要な側面の一つとなっている。場合[編集]言語、コンパイラ、.classファイルフォーマットが同時に設計され、また開発当初からオブジェクト指向が取り入れられていたため、名前修飾を必要とするような問題はJava実行時環境の実装には存在しない。これまでに見てきた名前修飾に類似した名前の変換が必要な場合がある。クラスのスコープは、その親クラスに制限される。パブリックな名前を内部クラスに対して与えなければならない。同様に無名のクラスには「偽の」パブリックな名前を生成しなければならない(無名クラスはコンパイラの概念であり、実行時には関係がない)。ファイルが生成される。いう名前付きの内部クラスを含む。対して局所的な無名の内部クラスを含む。通常のJavaクラス定義に用いることができないので、コンパイラは安全にこれらの名前を利用することができる。完全修飾名は特定のクラスローダインスタンスの内部でのみ一意であるので、実行時にはJavaにおける名前の解決は更に複雑である。そこで、二つの異なったクラスローダインスタンスが同じ名前のクラスを含む時、システムは初めルート(あるいはシステム)クラスローダを用いてクラスをロードしようとし、次いで階層に従って文脈クラスローダをたどる。ネイティブ間のインターフェースの扱い[編集]Javaのネイティブメソッドサポートによって、Javaで記述されたプログラムから他の言語で書かれたプログラム(通常CまたはC++)を呼ぶことができる。Interface(JNI)として標準化されている。Access(JNA)とは、Javaプログラムからネイティブの共有ライブラリにアクセスする方法をライブラリレベルで提供する。場合[編集]Pythonのプログラマは識別子の最初の二文字を下線にすることで、明示的にそれが「プライベートな名前」(スコープがクラスに限られる)であることを示すことができる。コンパイラはこれらを見るとプライベートな名前を大域的なシンボルに置き換える。これは、その識別子を包含するクラスの名前を一個の下線とともに前づけして行われる。場合[編集]これらのPascal処理系では、次のようにして名前修飾を抑制する。'myProc';Objective-Cの場合[編集]Objective-Cのメソッドは、本質的に二種類に分けられる。クラス(「静的」)メソッドで、もう一つはインスタンスメソッドである。Objective-Cでのメソッド宣言は次のような形式である。