を#if
または#ifdef
を使用して囲むべきかどうかという疑問が生じました。すなわち:質問を頼む__cplusplusを定義してゼロにすることはできますか?
#if __cplusplus
extern "C" {
#endif
または
#ifdef __cplusplus
extern "C" {
#endif
:__cplusplusがゼロに等しくなるように定義されている状況は、今までにありますか?
を#if
または#ifdef
を使用して囲むべきかどうかという疑問が生じました。すなわち:質問を頼む__cplusplusを定義してゼロにすることはできますか?
#if __cplusplus
extern "C" {
#endif
または
#ifdef __cplusplus
extern "C" {
#endif
:__cplusplusがゼロに等しくなるように定義されている状況は、今までにありますか?
標準によれば、__cplusplus
マクロは、である必要があります。正確な定義は使用されているC++標準に依存しますが、ゼロにはなりません。例えば
は、C++ 11のためにそれはノートで、201103L
でなければならない「この規格の将来のバージョンでは、より大きな値で、このマクロの値を置き換えることを意図しています。」
歴史的には、いくつかの古代非適合コンパイラでは、おそらく掘り下げるかもしれませんが、__cplusplus
は、規格に準拠していないことを示すために0に定義されました。これは歴史的なものです。
を参照してください:あなたはCコンパイラを使用する場合はHow are the __cplusplus directive defined in various compilers?
本当にそのようなコンパイラがあり、Microsoft Visual C++がその1つでした。 – EJP
@EJPは面白いので、 '#ifdef'はそのコンパイラでは動作しません。実際にはC言語のソースをコンパイルしていると誤って表示されますか? –
@EJPか、C++ビルドで '__cplusplus'を' 0'と定義していると言っていますか?その場合、 '#if'が失敗するため、あなたは必ず'#ifdef'を使用しなければなりません。私は今、さらに混乱しています。 –
そして '__cplusplus'はすべてで定義されることはありません - ので、私は'#のifdef'が適切な選択だと思います。 –
@ MarkRansom:これは必須ではありませんが、標準に従って、 'X'が未定義であれば' #if X 'できます。 –