C以外のC ++リンケージ言語?


25

C ++言語では、1つのソースファイルでC ++とCの両方を混在させることができます。例えば、

extern "C" {
    struct bar { /* ... */ }
}

C ++またはC以外の「リンケージ言語」をサポートしたことがありますか?例extern "Pascal"またはextern "Haskell"


ほとんどの場合、両方の言語がextern "C"同等の機能を実行して相互作用します
ラチェットフリーク

imlementationsは(§7.5)を自分のリンケージタイプを追加することを可能にすることによってC ++サポート他の結合は、質問は「DO実装が存在するかimplementtionsが存在していた」;-)する必要があります
ヨハネス

2
extern "C"ブロック内のテキストの構文とセマンティクスではなく、リンケージのみに影響します。言い換えれば、それはまだそのextern "C"ブロック内のC ++ です。シンボル名はマングルされていません。参照してくださいstackoverflow.com/q/1041866/712605
リチャード・ハンセン

回答:


17

extern "C" 唯一必要な場合があります:

すべての実装は、Cプログラミング言語「C」で記述された関数へのリンケージ、およびC ++関数「C ++」へのリンケージを提供するものとします。

ただし、この引用に従って他のものも存在できます。

文字列リテラルは、必要な言語リンケージを示します。この国際規格は、文字列リテラル「C」および「C ++」のセマンティクスを指定しています。「C」または「C ++」以外の文字列リテラルの使用は、実装定義のセマンティクスで条件付きでサポートされます。[注:したがって、実装で不明な文字列リテラルを使用したリンケージ指定には、診断が必要です。— end note] [注:文字列リテラルのスペルは、その言語を定義するドキュメントから取得することをお勧めします。たとえば、ビンテージに応じて、Ada(ADAではない)およびFortranまたはFORTRANです。—終了ノート]


1
これはどこから引用されていますか?
ポール

@paul c ++ 11標準ドラフト
アーロンマン

9

多くの(ほとんどの)環境では、「extern "C"」がシステム上のすべての言語のデフォルトのリンク規則です。

したがって、オペレーティングシステムと「外国語」言語「extern C」の実装に応じて、別のコンパイル言語でプログラムを呼び出す必要があります。


Cリンケージを使用しない環境(Pascal、つまりスタックで他の引数の順序を使用することが多く、呼び出し先が値を解放する必要があります)にもC互換モードがあります
-johannes

@johannes:実際のWindowsは、多くのもののためのPascal規則を使用しますが、それはCで、あまりにも必要とCが「持っていないので、extern "Language"」構文を、彼らは、プラットフォーム固有のCの拡張機能を経由して、それを行うので、C ++のそれだけではまだだextern "C"と特別なキーワードは、異なる呼び出し規約を指定します。
ジャン・ヒューデック

1
それでも、コンパイラベンダーが特別なリンケージタイプを追加する場合があります。他の言語との相互運用性に加えて、これは異なるC ++名前マングリングとの相互運用性にとっても興味深いかもしれません。質問は誰かがしたかどうかです:)
johannes


-4
  • いや!C ++は、「リンケージ言語」としてCのみをサポートします。

  • extern "C" {struct bar {/ * ... * /}}

  • 上記の構文は、変数、構造体、または関数の名前を変更しないことを意味します。C ++は、変数、構造体、または関数の名前を変更して、クラス、ネームスペース、および関数のオーバーロードを実装する可能性があるためです。

  • これを行わないと、リンカーは変数のオブジェクト、関数の構造を見つけられない可能性があります。

  • C ++は、Cと互換性があるように設計されています。extern "C"は、Cとの互換性を実装する方法です。


10
C ++標準の§7.5を確認してください。extern "C"そしてextern "C++"は必須の唯一のものですが、実装は他のものを提供することが許可されています。
ヨハネス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.