10

外部リンケージなしで C リンケージを持つ関数を宣言することは可能ですか? コンパイルしようとすると

extern "C" static void f() {}

私は得る

f.cc:1: error: invalid use of 'static' in linkage specification

これはある意味で理にかなっています。ではnamespace { extern "C" void f() {} }extern指定子は匿名名前空間の制限されたスコープをオーバーライドするようです。

これが不可能な場合、関数ポインタを C に渡すときに問題になりますか?

4

3 に答える 3

11

できるよ

extern "C" {
  static void f() {}
}

これにより、 functionfのタイプ C リンケージが提供されます。これは、実際には、プラットフォームで C 呼び出し規約を使用することを意味します。言語リンケージ仕様は外部リンケージの関数名にのみ適用されるため、関数の名前には引き続き C++/内部リンケージが含まれます。

を宣言で直接指定するextern "C"と、標準では、extern "C"がストレージ クラス指定子でもあると指定されているため、 を追加するstaticと競合が発生します。

関数ポインタをCに渡すときに問題がありますか

理論的には問題になる可能性があります-実装は、型がC++リンケージを持つ関数を呼び出すことと、型がCリンケージを持つ関数を呼び出すことの動作が異なることが許可されています。ただし、実装の詳細についてはわかりません。仕様がそれについて何を言っているのかだけです。仕様に従うのが最善であり、安全です。

于 2011-06-10T23:33:28.860 に答える
0

C++ の非メンバー関数または静的メンバー関数への関数ポインターを C 関数に渡すことができ、その C++ 関数に別の呼び出し規則を指定しない限り、機能するはずです。通常の C++ 関数は C 呼び出し規則を使用する必要があるため、その面で優れています。

非静的メンバー関数へのポインターを渡すことがそれほど簡単に機能しない主な理由は、オブジェクトのthisポインターに関する情報も何らかの形で渡す必要があるためです。これは通常、暗黙的で非表示のパラメーターとして発生します。メンバー関数。

于 2011-06-10T23:29:56.750 に答える