日前微软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的开发者来说是个好消息,希望大家尝鲜使用。