Visual Studio 2017 是不是完全支持 C99?

Posted

技术标签:

【中文标题】Visual Studio 2017 是不是完全支持 C99?【英文标题】:Does Visual Studio 2017 fully support C99?Visual Studio 2017 是否完全支持 C99? 【发布时间】:2018-07-14 20:57:26 【问题描述】:

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

如果没有,C99 还缺少哪些功能?

【问题讨论】:

【参考方案1】:

没有。

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++ 共同遗产的一个很好的副作用,但尽管表面上语法相似,但两者是非常不同的语言。

【讨论】:

我真的不明白这些微软人有什么大不了的交易。对于一个价值数十亿美元的公司来说,仅仅增加对 C99 的微不足道的支持真的那么难吗?谈论一群 C++ 精英。 一个值得注意的缺席是_Complex @annoying_squid:我宁愿让编译器供应商投入精力来可靠地支持我需要的结构,而不是即使支持我也没有兴趣使用的结构。此外,虽然它对 __restrict 的定义没有传播“基于”的概念,但 C99 定义“基于”的方式有很多愚蠢、模棱两可、荒谬和不可行的极端案例,我真的不会错误的编译器供应商拒绝尝试实现它,直到标准的作者想出一些明智的东西。【参考方案2】:

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

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

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

Answer to this question from 2015 有许多相关链接,包括支持 C 的 MS 路线图。

【讨论】:

在 C99 中,VLA 支持不是可选的。在 C11 中,它是可选的。 能否详细说明VS实现的restrict__restrict的区别?

以上是关于Visual Studio 2017 是不是完全支持 C99?的主要内容,如果未能解决你的问题,请参考以下文章

使用Visual Studio 2015,2017,CMake 3.10完全无法正常工作

Visual Studio 2017 RC 是不是向后兼容 Visual Studio 2013 解决方案?

文件正在通过 Visual Studio 下载,但不是通过 .exe

visual studio 2017许可证已过期怎么解决?

Visual Studio 2017 导致问题

Visual Studio 2017 - 为依赖项禁用 CMake