18

extern "C"ガードを含む C ヘッダー ファイルをよく見かけますが
、実際の関数は含まれていません。例えば:

/* b_ptrdiff.h - base type ptrdiff_t definition header */

#ifndef __INCb_ptrdiff_th
#define __INCb_ptrdiff_th

#ifdef __cplusplus
extern "C" {
#endif

#ifndef _PTRDIFF_T
#define _PTRDIFF_T
typedef long ptrdiff_t;
#endif /* _PTRDIFF_T */

#ifdef __cplusplus
}
#endif

#endif /* __INCb_ptrdiff_th */

関数の名前マングリングを防ぐことは知っていextern "C"ますが、変数や型の宣言に関する他のインターフェイスの問題も防ぐことができますか?

上記の例での の使用はextern "C"、結果として生じる互換性に関して無意味ですか?

4

2 に答える 2

23

一部のコンパイラ (まれですが) は、関数だけでなく、変数にも名前マングリングを実装しています。その場合、extern "C"必要になる場合があります。

一部のコンパイラ (これもまれですが、標準で必要です) は、名前だけでなく関数typedef void f();の言語リンケージを実装するため、さまざまな型をextern "C" { typedef void f(); }宣言します。

extern "C"また、関数を追加するためにヘッダーを変更しても、 が存在しないことに気付かないメンテナーもいます。

だけ入れることをお勧めします。

于 2015-11-04T16:16:17.743 に答える
9

いいえ、extern Cそこには必要ありませんが、新しい関数が追加されたときに忘れないように、すべてのヘッダーに含めると便利な場合があります。

于 2015-11-04T16:08:49.580 に答える