c17语言标准,官宣:MSVC新加入C11和C17标准

官宣

我们很高兴地宣布,从Visual Studio 2019 v16.8 Preview 3开始,C11和C17这两个C语言版本将加入到MSVC编译器工具集(toolset)。

多年以来,Visual Studio仅仅是因为C++的需要才对C进行有限度的支持。现在,事情有转变了:我们在编译器中添加了一个基于token的规范化预处理器,借助于两项新加入的编译器开关:/std:c11和/std:c17,我们终于可以正式宣布Visual Studio可以支持最新版本的C语言标准了。

具体都有些什么东西?

所有C11和C17中的特性都将得到支持。这意味着我们会添加如下的功能:> _Pragma> restrict> _Noreturn 和> _Alignas, _Alignof 和> _Generic 和 support> _Static_assert

IntelliSense组件将和这些特性无缝集成,你只需要将你的源代码文件命名为.c结尾,或者使用编译器开关/TC来启用语法高亮显示,如下图所示:

8d043e0093685932001e7ef633a27c73.png

目前IntelliSense仅支持关键字的高亮显示,还不能处理标准头文件中的宏,这个问题将在后面的版本中修复。

因为C17本质上只是对ISOC的一个Bug修复,另外还增加了大量的缺陷报告处理。我们对C11的支持已经包含了这些相关的缺陷处理,除了__STDC_VERSION__这个宏的定义有所不同以外,我们对C11和C17的支持基本没有什么不同。在C11中,__STDC_VERSION__被定义为201112L,C17中它被定义为201710L。

下面是一个简单的例子,它演示了上面所提到的一些功能特性:

02cccbcf59164f023aa99f2404f87842.png

f6c012ec58ed9abbd3d260f97d353ee7.png

因为引入了基于Token的规范化预处理器,上面提到的两个C编译器开关都隐式包含/Zc:preprocessor选项。如果你还是想使用传统的,基于字符的预处理器,你可以使用/Zc:preprocessor-这个开关来回到旧的模式。但是我们鼓励你能尽可能地修改代码,使之不再依赖旧的工作模式。

尚未支持的特性

当前不支持任何C11中的可选特性,但是我们还是会在将来的某个版本中提供影响力比较大的可选特性。在我们的路线图中,原子性(Atomic)和线程(Threading)已经提上日程。当前还不支持复数(Complex numbers),但是可以通过一些合适的测试宏来进行模拟。你可以告诉我们你想要哪些功能,这样我们就可以给它们排上优先级。由于Windows堆的一些特性,aligned_alloc还不支持,作为替代的,可以使用_aligned_malloc。另外,对于realloc的DR 400支持在当前版本中也尚未实现,因为这个可能会破坏ABI。

可变长数组

VLA(Variable Length Arrays,可变长数组)是C11中的一个可选特性,细心的读者可能也注意到了:VLA也是不支持的。从性能上来说,VLA没有定长数组好,同时当启用了安全检查时,VLA也不如malloc()。同时VLA还未潜在的攻击者提供了”Shifting the stack”漏洞利用机会和其他的一些安全隐患。基于这些原因,我们决定还是暂不支持VLA特性。

C11 和 C17 入门

为了在程序中使用C11或者C17,你可能需要安装最新版本的Windows SDK,SDK中包含了所需要的预处理器(/Zc:preprocessor)和新的通用C运行时库。一般来说,Windows SDK和Windows系统一起发布,因为正式版的Windows还没有包含这些新特性,所以你需要下载预览版的Windows SDK(用于提供给Windows Insider的Windows SDK预览版本)。请注意,当安装了预览版SDK后,在Visual Studio中配置了使用最新版Windows SDK的工程都会使用安装好的预览版SDK。

步骤1: 预览版SDK入口

下图是预览版SDK下载入口:

12acf0213f07ff7480401f81ebd77af6.png

步骤2: 下载预览版SDK

58194b676c0694dd54576bae09e2eab5.png

步骤3:安装预览版SDK

804777a8d1f53fb2ad6c6fd9053f6fc9.png

5b0bae657e9079ba241b9fe8d60b36fa.png

步骤4: 在Visual Studio v16.8 Preview 3中配置C11或者C17工作模式

首先打开工程属性,然后确保工程使用的SDK为预览版SDK。如下图所示,将WindowsSDK版本设置为10.0.20206.0(或者设置最新安装版本)

在CLanguageStandard中,根据项目需要,可以将它设置为C11或者C17。

75ba47bacde27b670370b6f1402b43f8.png

为了确保代码使用C11或者C17编译,请将源文件命名为以.c结尾,或者设置编译以下编译选项:

恭喜恭喜:经过以上这些步骤之后,你就可以体验C11和C17拉。

最后

Microsoft Visual C++团队的博客是我非常喜欢的博客之一,里面有很多关于Visual C++的知识和最新开发进展。大浪淘沙,如果你对Visual C++这门古老的技术还是那么感兴趣,则可以经常去他们那(或者我这)逛逛。本文来自:《C11 and C17 Standard Support Arriving in MSVC》

b482c9ff06da1e52fd46e587343f54bb.png

举报/反馈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值