特定のVisual Studioバージョンでコードをコンパイルしているかどうかを検出する方法


257

特定のバージョンのMicrosoft Visual Studioでコンパイルしているかどうかを確認する方法はありますか?

回答:


516

_MSC_VERそしておそらく_MSC_FULL_VERあなたが必要なものです。いくつかの使用例については、最近のブーストインストールでvisualc.hppを調べることもできます。

コンパイラのより新しいバージョンのいくつかの値は次のとおりです。

MSVC++ 14.24 _MSC_VER == 1924 (Visual Studio 2019 version 16.4)
MSVC++ 14.23 _MSC_VER == 1923 (Visual Studio 2019 version 16.3)
MSVC++ 14.22 _MSC_VER == 1922 (Visual Studio 2019 version 16.2)
MSVC++ 14.21 _MSC_VER == 1921 (Visual Studio 2019 version 16.1)
MSVC++ 14.2  _MSC_VER == 1920 (Visual Studio 2019 version 16.0)
MSVC++ 14.16 _MSC_VER == 1916 (Visual Studio 2017 version 15.9)
MSVC++ 14.15 _MSC_VER == 1915 (Visual Studio 2017 version 15.8)
MSVC++ 14.14 _MSC_VER == 1914 (Visual Studio 2017 version 15.7)
MSVC++ 14.13 _MSC_VER == 1913 (Visual Studio 2017 version 15.6)
MSVC++ 14.12 _MSC_VER == 1912 (Visual Studio 2017 version 15.5)
MSVC++ 14.11 _MSC_VER == 1911 (Visual Studio 2017 version 15.3)
MSVC++ 14.1  _MSC_VER == 1910 (Visual Studio 2017 version 15.0)
MSVC++ 14.0  _MSC_VER == 1900 (Visual Studio 2015 version 14.0)
MSVC++ 12.0  _MSC_VER == 1800 (Visual Studio 2013 version 12.0)
MSVC++ 11.0  _MSC_VER == 1700 (Visual Studio 2012 version 11.0)
MSVC++ 10.0  _MSC_VER == 1600 (Visual Studio 2010 version 10.0)
MSVC++ 9.0   _MSC_FULL_VER == 150030729 (Visual Studio 2008, SP1)
MSVC++ 9.0   _MSC_VER == 1500 (Visual Studio 2008 version 9.0)
MSVC++ 8.0   _MSC_VER == 1400 (Visual Studio 2005 version 8.0)
MSVC++ 7.1   _MSC_VER == 1310 (Visual Studio .NET 2003 version 7.1)
MSVC++ 7.0   _MSC_VER == 1300 (Visual Studio .NET 2002 version 7.0)
MSVC++ 6.0   _MSC_VER == 1200 (Visual Studio 6.0 version 6.0)
MSVC++ 5.0   _MSC_VER == 1100 (Visual Studio 97 version 5.0)

もちろん、上記のバージョン番号は、名前の年ではなく、バージョンボックスに表示されるVisual Studioのメジャーバージョンを指します。完全なリストはここにあります最近、Visual Studioは範囲を単調に更新し始めます。つまり、正確なコンパイラ値ではなく範囲をチェックする必要があります。

cl.exe /? 使用されているバージョンのヒントを提供します。例:

c:\program files (x86)\microsoft visual studio 11.0\vc\bin>cl /?
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.50727.1 for x86
.....

36
申し訳ありませんが、マイクロソフトがなぜこの情報を見つけやすくしないのですか?この投稿は非常に便利ですが、必須ではありません。
chrisw

6
このマクロは、プロジェクトで使用されているコンパイラのバージョンを反映していないようです。つまり、プロジェクトをアップグレードせずにVS2010プロジェクトを新しいバージョンで開いた場合、このマクロは使用中のコンパイラーを反映していません-IDEバージョンのみです。
thomthom 2016

私は他のいくつかのライブラリと一緒にlibFLACをコンパイルしている最中です。ツールセットv100を使用してコンパイルする必要があります。コードがあります#if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>。ただし、inttypes.hが見つかりません。非常に奇妙です
BernhardDöbler2016

1
@thomthom:このマクロは、ビルドプロジェクトの選択されたターゲットで使用されるツールセットのバージョンを正確に反映しています。またはより明確:プロジェクト->プロパティ->一般->プラットフォームツールセット。
ヤマズレ

4
@chriswこれをdocs.microsoft.com/en-us/cpp/preprocessor/…に文書化しました_MSC_VER 。を参照してください。これがお役に立てば
セバスチャン

47

はい、_MSC_VERはコンパイラーのバージョンを取得するマクロです。Visual C ++の最後のリリース数はの形式<compiler-major-version>.00.<build-number>で、00はマイナー番号です。したがって、_MSC_VERに評価され<major-version><minor-version>ます。

次のようなコードを使用できます。

#if (_MSC_VER == 1500)
   // ... Do VC9/Visual Studio 2008 specific stuff
#elif (_MSC_VER == 1600)
   // ... Do VC10/Visual Studio 2010 specific stuff
#elif (_MSC_VER == 1700)
   // ... Do VC11/Visual Studio 2012 specific stuff
#endif

コンパイラの連続リリース間の更新が表示され、が変更されていないcompiler-minor-versionため、次のコードは不要です。

#if (_MSC_VER >= 1500 && _MSC_VER <= 1600)
   // ... Do VC9/Visual Studio 2008 specific stuff
#endif

より詳細なバージョン情報(コンパイラのビルド番号など)へのアクセスは、他の組み込みプリプロセッサ変数を使用してここで見つけることができます


あなただけの、その場合には== 1500をチェックする必要があります
ホセ・

@José、確かにを使用してVC ++ 9をチェックするように単純化できます_MSC_VER_ == 1500が、MS _MSC_VERがコンパイラの更新やサービスパックなどで修正した場合(そうしたことはないと思います)、== 1500チェックが失敗する可能性があります。それが私がそれをそのようにコード化した理由です。
display101

__MSC_VERは、コンパイラーのバージョンのメジャーおよびマイナー番号コンポーネントに評価されます。これは更新によって変更されません。ビルド番号を含む_MSC_FULL_VERもあります。これを使用する必要はありません。
ホセ・

これを明確にするために編集した場合は、回答に賛成票を投じます。ベストホセ。
ホセ・

@José:より正確で詳細な回答ができるように回答を更新しました。
display101

11

_MSC_VERは、特定のバージョン番号に定義する必要があります。これに対して#ifdefを実行するか、実際の定義を使用してランタイムテストを実行できます。(何らかの理由で、どのコンパイラーでコンパイルしたかに基づいて異なるコードを実行したい場合は、そうです、おそらく#ifdefを探していました。:))



4

より一般的な回答として、http: //sourceforge.net/p/predef/wiki/Home/は、特定のコンパイラ、オペレーティングシステム、アーキテクチャ、標準などを検出するためのマクロのリストを保持しています。


1

これは少し古いですが、始められるはずです:

//******************************************************************************
// Automated platform detection
//******************************************************************************

// _WIN32 is used by
// Visual C++
#ifdef _WIN32
#define __NT__
#endif

// Define __MAC__ platform indicator
#ifdef macintosh
#define __MAC__
#endif

// Define __OSX__ platform indicator
#ifdef __APPLE__
#define __OSX__
#endif

// Define __WIN16__ platform indicator 
#ifdef _Windows_
#ifndef __NT__
#define __WIN16__
#endif
#endif

// Define Windows CE platform indicator
#ifdef WIN32_PLATFORM_HPCPRO
#define __WINCE__
#endif

#if (_WIN32_WCE == 300) // for Pocket PC
#define __POCKETPC__
#define __WINCE__
//#if (_WIN32_WCE == 211) // for Palm-size PC 2.11 (Wyvern)
//#if (_WIN32_WCE == 201) // for Palm-size PC 2.01 (Gryphon)  
//#ifdef WIN32_PLATFORM_HPC2000 // for H/PC 2000 (Galileo)
#endif

私はこの投票が上位投票の回答よりもはるかに好きです。_MSC_VERではstdio.hをインクルードする必要があるため
JMI MADISON 2017

1
_MSC_VERを含める必要はありませんstdio.h。これは簡単にテストできますecho int i = _MSC_VER; > tmp.c cl /nologo /c tmp.c
Kevin Smyth、2018

1
@JMIMADISON:_predefinedマクロあるMSC_VERに当てはまらないだけでなく、この回答は明らかに質問の回答にはなりません。コンパイラバージョンバージョンではなく、プラットフォームを検出します。
クリフォード

-11

ビジュアルスタジオで、ヘルプに移動します。アプリのコンパイルに使用しているVisual Studioのバージョンについて確認します。


6
これは深刻なことではありません。特にこのような評判のある人から。冗談を言っているだけだと思いますか?
BuvinJ 2016年

1
彼は問題を別の方法で解釈しただけだと思います。結局のところ、これは質問に対する最初の回答の1つです。
キースM

4
AFAIK @Haackedは有効で正解です。質問には「from my code」や、VS IDEをまだ使用していないことを示すその他のステートメントが含まれていないためです。
Alex Byrth
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.