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

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

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

【问题讨论】:

    标签: c visual-studio visual-studio-2017 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的区别?
    猜你喜欢
    • 2011-10-05
    • 2022-11-08
    • 2017-07-28
    • 2020-03-19
    • 2020-08-04
    • 1970-01-01
    • 2017-10-30
    • 2010-11-06
    相关资源
    最近更新 更多