/Zc (Conformance)

You can use the /Zc compiler options to specify standard or Microsoft-specific compiler behavior.


/Zc:option{,option ...}

You may set multiple /Zc options separated by commas in a single /Zc compiler option. If a /Zc option is enabled and disabled in the same command, the option that appears last is used.


When Visual Studio has implemented an extension to C or C++ that is incompatible with the standard, you can use a /Zc conformance option to specify standard-conforming or Microsoft-specific behavior. For some options, the Microsoft-specific behavior is the default, to prevent large-scale breaking changes to existing code. In other cases, the default is the standard behavior, where improvements in security, performance, or compatibility outweigh the costs of breaking changes. The default setting of each conformance option may change in newer versions of Visual Studio. For more information about each conformance option, see the article for the specific option. The /permissive- compiler option implicitly sets the conformance options that aren't set by default to their conforming settings.

Here are the /Zc compiler options:

Option Behavior
/Zc:__cplusplus Enable the __cplusplus macro to report the supported standard (off by default).
/Zc:__STDC__ Enable the __STDC__ macro to report the C standard is supported (off by default).
/Zc:alignedNew Enable C++17 over-aligned dynamic allocation (on by default in C++17).
/Zc:auto Enforce the new Standard C++ meaning for auto (on by default).
/Zc:char8_t Enable or disable C++20 native u8 literal support as const char8_t (off by default, except under /std:c++20).
/Zc:enumTypes[-] Enable Standard C++ rules for enum type deduction (off by default).
/Zc:externC Enforce Standard C++ rules for extern "C" functions (implied by /permissive-).
/Zc:externConstexpr Enable external linkage for constexpr variables (off by default).
/Zc:forScope Enforce Standard C++ for scoping rules (on by default).
/Zc:gotoScope Enforce Standard C++ goto rules around local variable initialization (implied by /permissive-).
/Zc:hiddenFriend Enforce Standard C++ hidden friend rules (implied by /permissive-)
/Zc:implicitNoexcept Enable implicit noexcept on required functions (on by default).
/Zc:inline Remove unreferenced functions or data if they're COMDAT or have internal linkage only (off by default).
/Zc:lambda Enable new lambda processor for conformance-mode syntactic checks in generic lambdas.
/Zc:noexceptTypes Enforce C++17 noexcept rules (on by default in C++17 or later).
/Zc:nrvo[-] Enable optional copy and move elisions (on by default under /O2, /permissive-, or /std:c++20 or later).
/Zc:preprocessor Use the new conforming preprocessor (off by default, except in C11/C17).
/Zc:referenceBinding A UDT temporary won't bind to a non-const lvalue reference (off by default).
/Zc:rvalueCast Enforce Standard C++ explicit type conversion rules (off by default).
/Zc:sizedDealloc Enable C++14 global sized deallocation functions (on by default).
/Zc:strictStrings Disable string-literal to char* or wchar_t* conversion (off by default).
/Zc:static_assert strict handling of static_assert (implied by /permissive-).
/Zc:templateScope[-] Enforce Standard C++ template parameter shadowing rules (off by default).
/Zc:ternary Enforce conditional operator rules on operand types (off by default).
/Zc:threadSafeInit Enable thread-safe local static initialization (on by default).
/Zc:throwingNew Assume operator new throws on failure (off by default).
/Zc:tlsGuards[-] Generate runtime checks for TLS variable initialization (on by default).
/Zc:trigraphs Enable trigraphs (obsolete, off by default).
/Zc:twoPhase Use non-conforming template parsing behavior (conforming by default).
/Zc:wchar_t wchar_t is a native type, not a typedef (on by default).
/Zc:zeroSizeArrayNew[-] Call member new/delete for 0-size arrays of objects (on by default).

For more information about conformance issues in MSVC, see Nonstandard behavior.

See also

MSVC compiler options
MSVC compiler command-line syntax