Visual Studio 2017是否完全支持C99?

最新版本的Visual Studio已经看到了对C99的改进支持。 最新版本VS2017现在支持所有C99吗?

如果没有,C99的哪些function仍然缺失?

没有。

https://docs.microsoft.com/en-us/cpp/visual-cpp-language-conformance

编译器对C99预处理程序规则的支持在Visual Studio 2017中是不完整的。支持可变参数宏,但预处理程序的行为中存在许多错误。

https://docs.microsoft.com/en-us/cpp/build/walkthrough-compile-ac-program-on-the-command-line

Visual C ++ C编译器通常与ISO C99标准兼容,但不严格兼容 。 在大多数情况下,可移植的C代码将按预期编译和运行。 Visual C ++不支持ISO C11中的大多数更改 。 Visual C ++编译器不推荐使用某些库函数和POSIX函数名。 支持这些function,但首选名称已更改。 有关更多信息,请参阅CRT和编译器警告(级别3)C4996中的安全function。

请记住,Visual C ++最终是一个C ++实现,而不是一个真正的C环境。 兼容性是C和C ++共享遗产的一个很好的副作用,但尽管语法上有相似之处,但两者是非常不同的语言。

很大程度上,是的,虽然一些核心语言function实现不合规(一些有错误,一些缺失)

  • 不支持可变长度数组(尽管现在这些数组是官方可选的)
  • 不支持restrict限定符,而是支持__restrict ,但它不完全相同
  • 不支持函数参数中数组声明中的顶级限定符(例如void foo(int a[const]) )以及相同上下文中的关键字static

但是,每个新版本的Visual Studio都会带来C99支持的改进,因此这项工作显然不会被冻结。

从2015年回答这个问题有许多相关链接,包括C支持的MS路线图。