微软VS将支持C11和C17标准

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

概述

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

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

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

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

#includeassert.h

#includestdalign.h

#includestdlib.h

#includestdnoreturn.h

#defineNO_WARN(X)\

_Pragma(warning(push))_Pragma(warning(disable:))X;\

_Pragma(warning(pop))

//Pickstoredorstoreibasedonthetypeofthedst

#definestore(x,y)_Generic((x),\

data*:stored,\

int*:storei)(x,y)

typedefstructdata{

_Alignas(8)unsignedinti;

}data;

static_assert(alignof(data)==8,dataisnotproperlyaligned);

voidstored(data*restrictdst,constdata*restrictsrc)

{

//Donottriggerwarning

dst-i=NO_WARN(-(src-i));

}

voidstorei(int*restrictdst,constint*restrictsrc)

{

*dst=*src;

}

noreturnvoidmy_exit(intret){

exit(ret);

}

intmain(){

datasrc,dst;

src.i=5;

inti,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支持。

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

基本设置

为了在程序中使用C11或C17,需要最新的WindowsSDK更新才能与兼容的预处理器(/Zc:preprocessor)并在新的UniversalCRuntime下工作。WindowsSDK版本与WindowsOS版本相对应。由于没有更改对应的Windows版本,因此需要一个InsiderPreviewWindowsSDK-WindowsSDK的预览版本,该版本与当前为WindowsInsiders发行的Windows版本相对应。注意,在安装InsiderPreviewWindows10SDK之后,配置为使用最新WindowsSDK的VisualStudio项目将使用InsiderPreview。

登陆MicrosoftInsider

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

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

一旦你点击这个页面,你就不会需要点击Flightnow。继续进行下一步,并下载InsiderPreviewWindows10SDK。

下载InsiderPreviewWindows10SDK

可以从software-download/windowsinsiderpreviewSDK安装InsiderPreviewWindowsSDK。

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

点击获取SDKInsider预览-内部版本开始下载。WindowsSDK的将来版本也将起作用。

安装InsiderPreviewWindows10SDK

InsiderPreviewWindowsSDK将作为.iso文件下载。

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

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

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

适用于UWP托管应用程序的WindowsSDK

适用于UWPC++应用程序的WindowsSDK

WindowsSDKforDesktopC++x86应用程序(为x86进行构建)

WindowsSDKforDesktopC++arm64应用程序(为arm64构建)

WindowsSDKforDesktopC++ARM应用程序(为ARM构建)

SDK将花费几分钟的时间来完成安装,然后就可以打开VisualStudio16.8Preview3。

配置C11或C17模式

为了在VisualStudio16.8Preview3中支持C11和C17。可以直接载最新的Preview版本。

在项目中,打开属性页面。确保该项目将使用InsidersPreviewWindow10SDK。将WindowsSDK版本设置为10.0..0(或刚刚安装的最新的InsiderPreviewWindows10SDK)。

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

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

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

总结

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




转载请注明:http://www.aierlanlan.com/rzdk/1390.html