2017-09-12 4 views
5

#ifまたは#ifdefを使用して囲むべきかどうかという疑問が生じました。すなわち:質問を頼む__cplusplusを定義してゼロにすることはできますか?

#if __cplusplus 
extern "C" { 
#endif 

または

#ifdef __cplusplus 
extern "C" { 
#endif 

:__cplusplusがゼロに等しくなるように定義されている状況は、今までにありますか?

+0

そして '__cplusplus'はすべてで定義されることはありません - ので、私は'#のifdef'が適切な選択だと思います。 –

+0

@ MarkRansom:これは必須ではありませんが、標準に従って、 'X'が未定義であれば' #if X 'できます。 –

答えて

3

標準によれば、__cplusplusマクロは、である必要があります。正確な定義は使用されているC++標準に依存しますが、ゼロにはなりません。例えば

は、C++ 11のためにそれノートで、201103Lでなければならない「この規格の将来のバージョンでは、より大きな値で、このマクロの値を置き換えることを意図しています。」

歴史的には、いくつかの古代非適合コンパイラでは、おそらく掘り下げるかもしれませんが、__cplusplusは、規格に準拠していないことを示すために0に定義されました。これは歴史的なものです。

を参照してください:あなたはCコンパイラを使用する場合はHow are the __cplusplus directive defined in various compilers?

+0

本当にそのようなコンパイラがあり、Microsoft Visual C++がその1つでした。 – EJP

+0

@EJPは面白いので、 '#ifdef'はそのコンパイラでは動作しません。実際にはC言語のソースをコンパイルしていると誤って表示されますか? –

+0

@EJPか、C++ビルドで '__cplusplus'を' 0'と定義していると言っていますか?その場合、 '#if'が失敗するため、あなたは必ず'#ifdef'を使用しなければなりません。私は今、さらに混乱しています。 –

関連する問題