1

[1] から抜粋した、次の段落の「extern リンケージ」と「C 言語リンケージ」について著者が意味することは何ですか。

C「extern宣言には 2 つの異なる形式があります。C上で使用されている extern と、extern C{ … } の中括弧の間の宣言です。最初の (インライン) 形式は、extern リンケージと C 言語リンケージを使用した宣言です。2 番目の形式は、影響を与えるだけです。言語リンケージ. したがって、次の 2 つの宣言は同等です:"

この例で彼が説明しようとしていることをさらに詳しく説明できますか?

[1] http://tldp.org/HOWTO/C++-dlopen/thesolution.html

4

2 に答える 2

4

著者が言っていることは、次の 2 行に関連しています。

extern "C" int foo;
extern "C" { int bar; }

foo宣言されているが定義されていない変数です。他の場所にも存在します。一方、barは宣言および定義されています。

宣言とは、何かがどこかに存在することを示すだけで、実際にそれを作成するものではないと考えてください。したがって、定義とは、宣言に加えてそのことを存在させることです。

後者は とまったく同じint bar;ですが、C リンケージで変数を「公開」します。たとえば、関数int max (int a, int b);_max、C 言語リンケージおよび_max$$int$intC++ 言語リンケージ (同じ名前の複数の関数を許可するため) のように公開できます。

このコンテキストでの「公開」とは、関数がリンカにどのように見えるかであり、コードがそれにリンクできることに注意してください。C 言語リンケージがなければ、通常、C コードを C++ ライブラリとリンクすることはかなり困難です。

于 2012-05-05T03:28:43.537 に答える
2

不器用な言い回し、ええ。彼が得ようとしているのは、

extern "C" int foo();

と同じです

extern "C" { extern int foo(); }

しかし、同じではありません

extern "C" { int foo(); }

extern int foo();... ただし、C++ のファイル スコープでは " " と " "の間に実質的な違いはないint foo();ため、頭を悩ませてもまったく問題ありません。実際に違いが生じるケースを次に示します。

extern "C" const int x = 12;
extern "C" { const int y = 12; }

x翻訳単位の外に表示されますが、表示されyません。

于 2012-05-05T03:32:28.550 に答える