как определить, компилирую ли я код с определенной версией visual studio?

<p>есть ли способ узнать, компилирую ли я под определенную версию microsoft visual studio?</p>

<p><code>\_msc\_ver</code> и, возможно, <code>\_msc\_full\_ver</code> - это то, что вам нужно. вы также можете проверить visualc.hpp в любой недавней установке для некоторых примеров использования.</p><p>некоторые значения для более поздних версий компилятора:</p><pre><code>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) </code></pre><p>номер версии выше, конечно, относится к основной версии вашей visual studio, которую вы видите в поле about, а не к году в названии. полный список можно найти <a href="https://en.wikipedia.org/wiki/microsoft\_visual\_c%2b%2b#internal\_version\_numbering">здесь</a> . <a href="https://blogs.msdn.microsoft.com/vcblog/2016/10/05/visual-c-compiler-version/">начиная с недавнего времени</a> , visual studio начнет монотонно обновлять свои диапазоны, то есть вы должны проверять диапазоны, а не точные значения компилятора.</p><p><code>cl.exe /?</code> даст подсказку об используемой версии, например:</p><pre><code>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 ..... </code></pre>

<p>да, \_msc\_ver - это макрос, который даст вам версию компилятора. последнее число выпусков visual c++ было в форме <code><compiler-major-version>.00.<build-number></code>, где 00 - младший номер. таким образом, <code>\_msc\_ver</code> будет оцениваться в <code><major-version><minor-version></code>.</p><p>вы можете использовать код как это:</p><pre><code>#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 </code></pre><p>похоже, что обновления между последовательными выпусками компилятора не изменили <code>compiler-minor-version</code>, поэтому следующий код не требуется:</p><pre><code>#if (\_msc\_ver >= 1500 && \_msc\_ver <= 1600) // ... do vc9/visual studio 2008 specific stuff #endif </code></pre><p>доступ к более подробной информации о версиях (такой как номер сборки компилятора) можно найти с помощью других встроенных переменных препроцессора <a href="http://msdn.microsoft.com/en-us/library/b0084kay.aspx">здесь</a> .</p>

<p>\_msc\_ver должен быть определен для определенного номера версии. вы можете либо использовать #ifdef, либо использовать фактическое определение и выполнить тест во время выполнения. (если по какой-то причине вы хотели запустить другой код в зависимости от того, с каким компилятором он был скомпилирован? да, возможно, вы искали #ifdef. :))</p>

<p>используя макрос <code>\_msc\_ver</code>.</p>

<p>в качестве более общего ответа <a href="http://sourceforge.net/p/predef/wiki/home/">http://sourceforge.net/p/predef/wiki/home/</a> содержит список макросов для обнаружения конкретных компиляторов, операционных систем, архитектур, стандартов и многого другого.</p>

<p>это немного старый, но вы должны начать:</p><pre><code>//****************************************************************************** // 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 </code></pre>