จะตรวจจับได้อย่างไรหากฉันรวบรวมรหัสด้วย 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
ขออภัย แต่ทำไม Microsoft ไม่ทำให้ข้อมูลนี้หาง่าย โพสต์นี้มีประโยชน์มาก แต่ไม่ควรทำ
chrisw

6
ดูเหมือนว่ามาโครนี้จะไม่แสดงเวอร์ชันคอมไพเลอร์ที่ใช้โดยโครงการ นั่นคือถ้าคุณเปิดโครงการ VS2010 ในรุ่นที่ใหม่กว่าโดยไม่อัปเกรดโครงการแมโครนี้จะไม่แสดงคอมไพเลอร์ที่ใช้ - เฉพาะรุ่น IDE
Thomthom

ฉันอยู่ระหว่างการรวบรวม libFLAC ร่วมกับห้องสมุดอื่น ๆ พวกเขาต้องการการรวบรวมที่จะต้องทำโดยใช้ toolset v100 #if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>มีรหัสเป็น แม้ว่า inttypes.h ไม่สามารถพบได้ แปลกมาก
แบร์นฮาร์ดDöbler

1
@thomthom: แมโครนี้แสดงถึงชุดเครื่องมือรุ่นที่ใช้โดยเป้าหมายที่เลือกของโครงการบิลด์ หรือมากกว่านั้น: โครงการ -> คุณสมบัติ -> ทั่วไป -> ชุดเครื่องมือแพลตฟอร์ม
Yamakuzure

4
@chrisw ตอนนี้เราเอกสารนี้ได้ที่docs.microsoft.com/en-us/cpp/preprocessor/..._MSC_VER ดู หวังว่านี่จะช่วยได้
Sebastian

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

การเข้าถึงรายละเอียดเพิ่มเติมเวอร์ชันข้อมูล (เช่นคอมไพเลอร์สร้างจำนวน) สามารถพบการใช้ตัวแปร builtin ก่อนประมวลผลอื่น ๆที่นี่


คุณเพียงแค่ต้องตรวจสอบ == 1,500 ในกรณีนั้น
โฮเซ

@ Joséจริงเราสามารถทำให้มันง่ายขึ้นเพียงแค่ตรวจสอบ VC ++ 9 ด้วย_MSC_VER_ == 1500อย่างไรก็ตามถ้า MS ทำการแก้ไข_MSC_VERด้วยการปรับปรุงคอมไพเลอร์เซอร์วิสแพ็ค ฯลฯ (ฉันไม่คิดว่าพวกเขาจะมี) จากนั้น== 1500ตรวจสอบอาจแตก นี่คือสาเหตุที่ฉันเขียนรหัสด้วยวิธีนั้น
display101

__MSC_VER ประเมินองค์ประกอบหลักและรองของรุ่นคอมไพเลอร์ สิ่งนี้จะไม่เปลี่ยนแปลงเมื่อมีการอัปเดตมี _MSC_FULL_VER พร้อมรวมหมายเลขบิลด์ด้วยฉันไม่จำเป็นต้องใช้สิ่งนั้น
José

ฉันจะโหวตคำตอบถ้าคุณแก้ไขเพื่อชี้แจงนี้ Bests Jose
โฮเซ

@ 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

1
_MSC_VERไม่ต้องการให้คุณรวมstdio.hซึ่งสามารถทดสอบได้ง่ายecho int i = _MSC_VER; > tmp.c cl /nologo /c tmp.c
Kevin Smyth

1
@JMIMADISON: ไม่เพียง แต่มันไม่เป็นความจริงเกี่ยวกับMSC_VER ซึ่งเป็นแมโคร _predefinedคำตอบนี้ชัดเจนไม่ตอบคำถาม - ตรวจพบแพลตฟอร์มไม่ใช่เวอร์ชั่นคอมไพเลอร์
Clifford

-11

ใน visual studio ไปช่วย | เกี่ยวกับและดูเวอร์ชันของ Visual Studio ที่คุณใช้เพื่อรวบรวมแอปของคุณ


6
สิ่งนี้จะไม่ร้ายแรง โดยเฉพาะจากคนที่มีชื่อเสียงอย่างนี้ ฉันคิดว่าคุณเป็นแค่เรื่องตลก?
BuvinJ

1
ฉันคิดว่าเขาเพิ่งตีความคำถามด้วยวิธีอื่น ท้ายที่สุดนี่เป็นหนึ่งในคำตอบแรกของคำถาม
Keith M

4
AFAIK @Haacked นั้นถูกต้องและถูกต้องเนื่องจากคำถามไม่รวม "จากรหัสของฉัน" หรือข้อความอื่น ๆ ที่ระบุว่าเขา / เธอยังไม่ได้ใช้ VS IDE
Alex Byrth
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.