【发布时间】:2018-07-14 20:57:26
【问题描述】:
Visual Studio 的最新版本改进了对 C99 的支持。最新版本 VS2017 现在支持所有 C99 了吗?
如果没有,C99 还缺少哪些功能?
【问题讨论】:
标签: c visual-studio visual-studio-2017 c99
Visual Studio 的最新版本改进了对 C99 的支持。最新版本 VS2017 现在支持所有 C99 了吗?
如果没有,C99 还缺少哪些功能?
【问题讨论】:
标签: c visual-studio visual-studio-2017 c99
没有。
https://docs.microsoft.com/en-us/cpp/visual-cpp-language-conformance
Visual Studio 2017 中编译器对 C99 预处理器规则的支持不完整。支持可变参数宏,但预处理器的行为存在许多错误。
https://docs.microsoft.com/en-us/cpp/build/walkthrough-compile-a-c-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++ 共同遗产的一个很好的副作用,但尽管表面上语法相似,但两者是非常不同的语言。
【讨论】:
__restrict 的定义没有传播“基于”的概念,但 C99 定义“基于”的方式有很多愚蠢、模棱两可、荒谬和不可行的极端案例,我真的不会错误的编译器供应商拒绝尝试实现它,直到标准的作者想出一些明智的东西。
大部分是的,尽管某些核心语言功能的实现不合规(有些存在错误,有些缺失)
restrict 限定符,而是支持__restrict,但并不完全相同void foo(int a[const]))以及同一上下文中的关键字static
但是,Visual Studio 的每个新版本都会带来对 C99 支持的改进,因此这项工作显然没有被冻结。
Answer to this question from 2015 有许多相关链接,包括支持 C 的 MS 路线图。
【讨论】:
restrict和__restrict的区别?