Differences between Visual Studio 2003, 2005, 2008, 2010, 2012, 2013, and 2015
Mon, Feb 27, 2017
4-minute read
If you’re interested in knowing when specific Visual Studio compiler options have been introduced, here you go.
2003 to 2005
Option Purpose
------ -------
/analyze Enable code analysis.
/bigobj Increases the number of addressable sections in an .obj file.
/doc Process documentation comments to an XML file.
/errorReport Allows you to provide internal compiler error (ICE) information directly to the Visual C++ team.
/favor Produces code that is optimized for a specific x64 architecture or for the specifics of
micro-architectures in both the AMD64 and Extended Memory 64 Technology (EM64T) architectures.
/FC Display full path of source code files passed to cl.exe in diagnostic text.
/Fp Specifies a precompiled header file name.
/G1 Optimize for Itanium processor. Only available in the IPF cross compiler or IPF native compiler.
/G2 Optimize for Itanium2 processor (default between /G1 and /G2). Only available in the IPF cross
compiler or IPF native compiler.
/GF Enables string pooling.
/homeparams Forces parameters passed in registers to be written to their locations on the stack upon function
entry. This compiler option is only for the x64 compilers (native and cross compile).
/hotpatch Creates a hotpatchable image.
/LN Creates an MSIL module.
/openmp Enables #pragma omp in source code.
/QIPF\_B Does not generate sequences of instructions that give unexpected results, according to the errata
for the B CPU stepping. (IPF only).
/QIPF\_C Does not generate sequences of instructions that give unexpected results, according to the errata
for the C CPU stepping. (IPF only).
/QIPF\_fr32 Do not use upper 96 floating-point registers. (IPF only).
/QIPF\_noPIC Generates an image with position dependent code (IPF only).
/QIPF\_restrict\_plabels Enhances performance for programs that do not create functions at runtime. (IPF only).
/Zx Generates debuggable optimized code. Only available in the IPF cross compiler or IPF native
compiler.
2005 to 2008
Option Purpose
------ -------
/MP Compiles multiple source files by using multiple processes.
/Qfast\_transcendentals Generates fast transcendentals.
/Qimprecise\_fwaits Removes fwait commands inside try blocks.
2008 to 2010
Option Purpose
------ -------
/Fi Sets the preprocessed output file name.
2010 to 2012
Option Purpose
------ -------
/kernel The compiler and linker will create a binary that can be executed in the
Windows kernel.
/Qpar (Auto-Parallelizer) Enables automatic parallelization of loops that are marked with the #pragma
loop() directive.
/Qvec-report (Auto-Vectorizer Reporting Level) Enables reporting levels for automatic vectorization.
/sdl Enables additional compiler security checks.
/volatile Selects how the volatile keyword is interpreted.
/ZW Produces an output file to run on the Windows Runtime.
2012 to 2013
Option Purpose
------ -------
/cgthreads Specifies number of cl.exe threads to use for optimization and code generation.
/FS Forces writes to the program database (PDB) file to be serialized through MSPDBSRV.EXE.
/Gv Uses the \_\_vectorcall calling convention. (x86 and x64 only)
/Gw Enables whole-program global data optimization.
/Qsafe\_fp\_loads Uses integer move instructions for floating-point values and disables certain floating point load
optimizations.
/Zo Generate enhanced debugging information for optimized code in non-debug builds.
2013 to 2015
Option Purpose
------ -------
/guard:cf Adds control flow guard security checks.
/W0, /W1, /W2, /W3, /W4 Sets which warning level to output.
/w1, /w2, /w3, /w4 Sets the warning level for the specified warning.
/wd Disables the specified warning.
/we Treats the specified warning as an error.
/wo Displays the specified warning only once.
/Wv Displays no warnings introduced after the specified version of the compiler.
/WX Treats all warnings as errors.
PowerShell to Generate these:
$2003 = $($wr = Invoke-WebRequest (Get-Clipboard); Get-WebRequestTable.ps1 -WebRequest $wr -TableNumber 0)
$2005 = $($wr = Invoke-WebRequest (Get-Clipboard); Get-WebRequestTable.ps1 -WebRequest $wr -TableNumber 0)
$2008 = $($wr = Invoke-WebRequest (Get-Clipboard); Get-WebRequestTable.ps1 -WebRequest $wr -TableNumber 0)
$2010 = $($wr = Invoke-WebRequest (Get-Clipboard); Get-WebRequestTable.ps1 -WebRequest $wr -TableNumber 0)
$2012 = $($wr = Invoke-WebRequest (Get-Clipboard); Get-WebRequestTable.ps1 -WebRequest $wr -TableNumber 0)
$2013 = $($wr = Invoke-WebRequest (Get-Clipboard); Get-WebRequestTable.ps1 -WebRequest $wr -TableNumber 0)
$2015 = $($wr = Invoke-WebRequest (Get-Clipboard); Get-WebRequestTable.ps1 -WebRequest $wr -TableNumber 0)
Compare-Object $2013 $2015 -Property { $\_.Option -replace '\\s','' } -PassThru | ? SideIndicator -eq '=>' | Format-Table Option,Purpose -Wrap | clip
Compare-Object $2003 $2005 -Property { $\_.Option -replace '\\s','' } -PassThru | ? SideIndicator -eq '=>' | Format-Table Option,Purpose -Wrap | clip
Compare-Object $2005 $2008 -Property { $\_.Option -replace '\\s','' } -PassThru | ? SideIndicator -eq '=>' | Format-Table Option,Purpose -Wrap | clip
Compare-Object $2008 $2010 -Property { $\_.Option -replace '\\s','' } -PassThru | ? SideIndicator -eq '=>' | Format-Table Option,Purpose -Wrap | clip
Compare-Object $2010 $2012 -Property { $\_.Option -replace '\\s','' } -PassThru | ? SideIndicator -eq '=>' | Format-Table Option,Purpose -Wrap | clip
Compare-Object $2012 $2013 -Property { $\_.Option -replace '\\s','' } -PassThru | ? SideIndicator -eq '=>' | Format-Table Option,Purpose -Wrap | clip
Compare-Object $2013 $2015 -Property { $\_.Option -replace '\\s','' } -PassThru | ? SideIndicator -eq '=>' | Format-Table Option,Purpose -Wrap | clip