关于ZAKER 融媒体解决方案 合作 加入
51CTO 09-18

MSVC 宣布支持 C11 和 C17 标准

日前微软 VS 团队宣布,将在 Visual Studio 2019 版本 16.8 预览版 3 开始,正式支持 C11 和 C17 为 MSVC 编译器。多年来,Visual Studio 仅在 C++ 要求的范围内支持 C。随着两个新的编译器开关 /std:c11 和 /std:c17 的出现,VS 将正式支持最新的 ISO C 语言标准。

概述

支持 C11 和 C17 的所有必需功能,将会添加这些功能:_Pragma,restrict,_Noreturn 和,_Alignas,_Alignof 和,_Generic 和,_Static_assert

IntelliSense 本身也具有这些功能,只需为源文件使用 .c 文件扩展名或 /TC 编译器开关即可为 C 代码启用语法突出显示。

IntelliSense 高亮仅适用于关键字,不适用于标准标头引入的宏。由于 C17 本质上只是 ISO C 的错误修复版本,并且采用了许多缺陷报告,因此对 C11 的支持已经包括所有相关的缺陷报告。目前,C11 和 C17 版本之间没有什么区别,除了 __STDC_VERSION__ 宏,该宏扩展为 201112L ( 对于 C11 ) 和 201710L ( 对于 C17 ) 。

这是显示这些功能的示例:

#include #include #include #include #define NO_WARN ( X ) _Pragma ( "warning ( push ) " ) _Pragma ( "warning ( disable: 4146 ) " ) X; _Pragma ( "warning ( pop ) " ) #define store ( x, y ) _Generic ( ( x ) , data*: stored, int* : storei ) ( x, y ) typedef struct data {_Alignas ( 8 ) unsigned int i;} data;static_assert ( alignof ( data ) == 8, "data is not properly aligned" ) ;void stored ( data* restrict dst, const data* restrict src ) {// Do not trigger warning 4245dst->i = NO_WARN ( - ( src->i ) ) ;}void storei ( int* restrict dst, const int* restrict src ) {*dst = *src;}noreturn void my_exit ( int ret ) {exit ( ret ) ;}int main ( ) {data src, dst;src.i = 5;int i, j;i = 10;store ( &src, &dst ) ;store ( &i, &j ) ;my_exit ( 0 ) ;}

由于包含了基于令牌的一致性预处理器,因此这两个新的 C 编译器开关暗示 /Zc:preprocessor。如果要与 C11 或 C17 一起使用基于字符的传统预处理器,则需要显式传递编译器开关 /Zc:preprocessor-。

尽管目前不支持任何 C11 可选功能,会在将来的版本中提供最具影响力的可选功能。原子和线程支持在我们的路线图上。目前尚不支持对复数的支持,并且通过适当的功能测试宏来强制不支持复数。

由于 Windows 堆的性质,缺少对 aligned_alloc 的支持。另一种方法是使用 _aligned_malloc。

此外,由于 realloc 更改可能会破坏 ABI,因此目前尚未实现 DR 400 支持。

同时也不支持 VLA。可变长度数组通常比可比的固定大小数组效率低,并且在安全可靠地实现时,与等效数组相比效率通常较低。VLA 存在 gets ( ) 安全问题,可以被 " 转移堆栈 " 和其他的利用。由于这些原因,VLA 支持仅仅为可选功能。

基本设置

为了在程序中使用 C11 或 C17,需要最新的 Windows SDK 更新才能与兼容的预处理器 ( /Zc:preprocessor ) 并在新的 Universal C Runtime 下工作。Windows SDK 版本与 Windows OS 版本相对应。由于没有更改对应的 Windows 版本,因此需要一个 Insider Preview Windows SDK-Windows SDK 的预览版本,该版本与当前为 Windows Insiders 发行的 Windows 版本相对应。注意,在安装 Insider Preview Windows 10 SDK 之后,配置为使用最新 Windows SDK 的 Visual Studio 项目将使用 Insider Preview。

登陆 Microsoft Insider

任何人都可以创建一个免费的 Microsoft 帐户,然后选择加入 Insider 程序, " 注册 " 并登录。

注册后,将提供开始运行 Insider 版本的 Windows 的选项,但是下载和使用 Insider Windows 10 SDK 是非必须的。

一旦你点击这个页面,你就不会需要点击 "Flight now"。继续进行下一步,并下载 Insider Preview Windows 10 SDK。

下载 Insider Preview Windows 10 SDK

可以从 software-download/windowsinsiderpreviewSDK 安装 Insider Preview Windows SDK。

Insider 页面描述了需要使用 Windows 10 Insider Preview OS。对于 Windows SDK 中包含的某些内容,这是正确的,取决于 Windows 的较早版本中不存在的新 API,但是 Windows 和 Universal C Runtime 标头将正确安装并且在没有 Insider OS 的情况下可用。

点击 " 获取 SDK Insider 预览 - 内部版本 20206" 开始下载。Windows SDK 的将来版本也将起作用。

安装 Insider Preview Windows 10 SDK

Insider Preview Windows SDK 将作为 .iso 文件下载。

挂载 .iso 文件并运行 WinSDKSetup.exe 以开始安装。

选择在计算机上安装 Windows 软件开发套件,然后单击下一步。必须选择是否允许深入了解 Windows SDK 的使用,并且必须接受许可协议,然后才能到达功能部件安装页面。应该安装的唯一功能 ( 除非使用 Windows 10 的 Insider Preview 构建 ) :

适用于桌面应用程序的 Windows SDK 签名工具

适用于 UWP 托管应用程序的 Windows SDK

适用于 UWP C ++ 应用程序的 Windows SDK

Windows SDK for Desktop C++ x86 应用程序 ( 为 x86 进行构建 )

Windows SDK for Desktop C++ arm64 应用程序 ( 为 arm64 构建 )

Windows SDK for Desktop C++ ARM 应用程序 ( 为 ARM 构建 )

SDK 将花费几分钟的时间来完成安装,然后就可以打开 Visual Studio 16.8 Preview 3。

配置 C11 或 C17 模式

为了在 Visual Studio 16.8 Preview 3 中支持 C11 和 C17。可以直接载最新的 Preview 版本。

在项目中,打开 " 属性 " 页面。确保该项目将使用 Insiders Preview Window 10 SDK。将 Windows SDK 版本设置为 10.0.20206.0 ( 或刚刚安装的最新的 Insider Preview Windows 10 SDK ) 。

将能看到一个新选项:C 语言标准。

当语言为 C++ 时使用 C++ 语言标准,当文件扩展名为 .cpp 为默认设置。当语言为 C 时,使用 C 语言标准版本,扩展名为 .c,默认 c 版本。为确保使用 C11 或 C17 构建项目,必须确保它是文件,或在 " 属性 " 选项卡中将代码设置为编译为 C。

这些项目更改之后,就可以测试使用 C11 和 C17。

总结

支持 C11 和 C17,这对使用 VS Windows 的开发者来说是个好消息,希望大家尝鲜使用。

【责任编辑:赵宁宁 TEL:(010)68476606】

点赞 0

以上内容由"51CTO"上传发布 查看原文

觉得文章不错,微信扫描分享好友

扫码分享