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 解决方案?