Visual Studio 2017是否完全支持C99?

use*_*783 9 c c99 visual-studio visual-studio-2017

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

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

Dai*_*Dai 15

没有.

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函数名.支持这些功能,但首选名称已更改.有关更多信息,请参阅CRT和编译器警告(级别3)C4996中的安全功能.

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

  • 我真的不明白这些微软人到底有什么大不了的。对于一家价值数十亿美元的公司来说,仅仅为 C99 添加微不足道的支持真的那么难吗?谈论一群 C++ 精英。 (3认同)

AnT*_*AnT 5

大体上是的,尽管某些核心语言功能是不合规地实现的(有些存在错误,有些却缺失了)

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

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

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

  • 在 C99 中,VLA 支持不是可选的。在 C11 中,它是可选的。 (3认同)
  • 您能否详细说明VS实现的`restrict`和`__restrict`之间的区别? (2认同)