2015-11-04 11 views
18

私はよく、extern "C"ガード、
を含むCヘッダファイルを見つけましたが、実際の機能は含まれていません。たとえば:メソッドなしのヘッダーにextern "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"を使用すると、互換性の面で意味がありませんか?

+1

'extern" C "'は名前のマングリングを「防止」しません。これはコンパイラに、とりわけ、Cスタイルの名前マングリングを使用するよう指示します。 –

答えて

23

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

いくつかのコンパイラ(それも稀だが、標準で必要)機能のための言語リンケージを実装種類だけではなく、名前、そうtypedef void f();extern "C" { typedef void f(); }は、異なるタイプを宣言します。

また、機能を追加するためにヘッダーを変更した場合、メンテナーの中にはextern "C"がないことに気付かないものもあります。

私はあなたがそれを含めることをお勧めします。

+0

標準でタイプリンケージが必要*ですか?もしそうなら、どうしてそんなに珍しいのですか? – Quentin

+1

@クエンティンはい、私は確信しています。しかし、この機能のためにユーザーからの要求はほとんどないため、実装はより需要の高い他の機能に焦点を当てています。 – hvd

+0

「標準によって要求される」が「常に利用可能/実装されている」という意味ではないことを認めていただき、ありがとうございます。 –

9

いいえ、extern Cは必要ありませんが、新しい機能を追加したときに忘れられないように、すべてのヘッダーに含めると便利です。

関連する問題