มีวิธีใดบ้างที่จะทราบว่าฉันกำลังคอมไพล์ภายใต้เวอร์ชัน Microsoft Visual Studio ที่เฉพาะเจาะจงหรือไม่
มีวิธีใดบ้างที่จะทราบว่าฉันกำลังคอมไพล์ภายใต้เวอร์ชัน Microsoft Visual Studio ที่เฉพาะเจาะจงหรือไม่
คำตอบ:
_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
.....
#if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>
มีรหัสเป็น แม้ว่า inttypes.h ไม่สามารถพบได้ แปลกมาก
_MSC_VER
ดู หวังว่านี่จะช่วยได้
ใช่ _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 ก่อนประมวลผลอื่น ๆที่นี่
_MSC_VER_ == 1500
อย่างไรก็ตามถ้า MS ทำการแก้ไข_MSC_VER
ด้วยการปรับปรุงคอมไพเลอร์เซอร์วิสแพ็ค ฯลฯ (ฉันไม่คิดว่าพวกเขาจะมี) จากนั้น== 1500
ตรวจสอบอาจแตก นี่คือสาเหตุที่ฉันเขียนรหัสด้วยวิธีนั้น
_MSC_VER ควรกำหนดเป็นหมายเลขรุ่นเฉพาะ คุณสามารถ #ifdef บนมันหรือคุณสามารถใช้การกำหนดที่แท้จริงและทำการทดสอบรันไทม์ (ถ้าด้วยเหตุผลบางอย่างที่คุณต้องการเรียกใช้โค้ดที่แตกต่างกันตามคอมไพเลอร์ตัวใดที่คอมไพล์ด้วยใช่คุณอาจกำลังมองหา #ifdef :))
โดยใช้_MSC_VER
มาโคร
ในฐานะที่เป็นคำตอบทั่วไปเพิ่มเติมhttp://sourceforge.net/p/predef/wiki/Home/รักษารายชื่อของมาโครสำหรับตรวจจับคอมไพเลอร์ที่พิเศษระบบปฏิบัติการสถาปัตยกรรมมาตรฐานและอื่น ๆ
นี่เก่าไปหน่อย แต่คุณควรเริ่มต้น:
//******************************************************************************
// 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
ซึ่งสามารถทดสอบได้ง่ายecho int i = _MSC_VER; > tmp.c
cl /nologo /c tmp.c
ใน visual studio ไปช่วย | เกี่ยวกับและดูเวอร์ชันของ Visual Studio ที่คุณใช้เพื่อรวบรวมแอปของคุณ