2017-04-26 28 views
2

Microsoft Visual C++コンパイラ(以前はGCCが他のコンパイラの中で使用されていました)でマルチプラットフォームのC++プロジェクトをコンパイルしようとしています。__cplusplusではなく_MSVC_LANGを使用しても安全ですか?

今、私はこの1つのようないくつかのプリプロセッサディレクティブに遭遇:

#if __cplusplus < 201103L 
    // Define some macros of C++11 the code really relies on. 
    // [...] 
#endif 

私は、Visual Studio 2015を使用していますが、__cplusplusはまだ199711Lとして定義されています。 This post from the Microsoft blogは、_MSVC_LANGも確認するようアドバイスします。

_MSVC_LANG >= 201402Lはどの程度までC++ 11に準拠していませんか?

+3

チェック*も*、*代わりに*(論理的か)ではありません。 –

+0

さて、編集しました。 – WolfgangS

答えて

1

まずあなたは、ポータブルの回避策をしたい場合は、あなたが行うことができます:あなたはリンク

#if __cplusplus < 201103L && _MSVC_LANG < 201103L 
/* ... */ 
#elif __cplusplus >= 201402L || _MSVC_LANG >= 201402L 

コメントは、それが__cplusplusが正しく設定されていないバグだとそのテスト_MSVC_LANGは一時しのぎであると述べています。しかし、/std:c++14のVC 2017(19.10.25017)は、まだ__cplusplusから199711に設定されています。私はそれがC++のサポートがまだ完全には完了していないのか、まったくそれに慣れていないのかは分かりません。

_MSVC_LANGマクロは、Microsoftエクステンションです。他のほとんどのコンパイラは、コンパイラがMicrosoftであるかどうかを簡単にテストできるように、それを設定しません。 (唯一の例外:それはそのMSVC互換モードであるとしてclang++ --std:c++14 -fms-compatibility-version=19.10は、201402L__cplusplus_MSVC_LANGの両方を設定します。)

関連する問題