Which C99 features are available in the MS Visual Studio compiler?

I believe that the only non-library language feature of C99 (that's not in C90) supported in MSVC is // comments. Other than that when compiling in C mode, the only C99 features you'll get are due to C99 library features that Microsoft has brought in because those features were brought in the C++ standard/draft standard/TR that the MS compiler was supporting. For example, you got stdint.h in VS 2010 because it was in the C++ TR1 draft.

Microsoft has made it clear that they see no strong push from the market to allocate resources to support C99 in MSVC, so it's almost certain that the only parts of C99 you'll see in MSVC's C compiler mode are those that get brought in because of C++.

One of things that I find frustrating is that non-library C99 language features that have been part of C++ for a long time are not available in C mode. Personally, I'd find it very helpful if just the C99 ability to mix statements with declarations were supported when compiling C code.

But it seems that the language features you see in C with MSVC today is what you'll get from here on.


Fortunately, Microsoft's stance on this issue has changed. MSVC++ version 12.0 (part of Visual Studio 2013) added support for

  • _Bool type.
  • Compound literals.
  • Designated initializers.
  • Mixing declarations with code.
  • __func__ predefined identifier.

You can check the _MSC_VER macro for values greater than or equal to 1800 to see whether these features are supported.

Standard library support has been updated and is mostly complete since MSVC 14.0 (Visual Studio 2015). This release also added the inline keyword.

The restrict keyword, a conformant preprocessor and C11 support arrived in Visual Studio 2019 Release 16.8, but this doesn't include some mandatory C99 features made optional in C11.

Things that earlier versions already supported (I think since at least MSVC 7.1 / Visual Studio 2003):

  • // style comments.
  • long long type.
  • Flexible array members (Microsoft called them "unsized arrays").
  • Variadic macros (at least partially).

Things that are still missing:

  • Variable length arrays (optional in C11, not planned).
  • _Complex type (optional in C11, not planned).
  • C11 multithreading (optional feature, on the roadmap).
  • C11 atomic primitives and types (optional feature, on the roadmap).