日前,微软VS团队宣布从VisualStudio2019version16.8previewversion3开始正式支持C11和C17作为MSVC编译器。多年来,VisualStudio只支持C达到C++要求的程度。随着两个新的编译器开关/std:c11和/std:c17的出现,VS将正式支持最新的ISOC语言标准。概述支持C11和C17所需的所有功能,将添加这些功能:_Pragma、restrict、_Noreturn、_Alignas、_Alignof、_Generic、_Static_assertIntelliSense本身也有这些功能,只需对源文件使用.c文件扩展名或/TC编译器开关启用C代码的语法突出显示。IntelliSense突出显示仅适用于关键字,不适用于标准标头引入的宏。由于C17本质上只是ISOC的错误修复版本,采用了许多缺陷报告,因此对C11的支持已经包括所有相关的缺陷报告。目前,C11和C17版本之间没有区别,除了__STDC_VERSION__宏,它扩展到201112L(对于C11)和201710L(对于C17)。下面是显示这些函数的示例:#include#include#include#include#defineNO_WARN(X)_Pragma("warning(push)")_Pragma("warning(disable:4146)")X;_Pragma("warning(pop)")#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){//Donottriggerwarning4245dst->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编译器开关是Imply/Zc:preprocessor。如果要在C11或C17中使用传统的基于字符的预处理器,则需要显式传递编译器开关/Zc:preprocessor-。尽管目前不支持任何C11可选功能,但最具影响力的可选功能将在未来版本中提供。原子和线程支持在我们的路线图上。目前不支持对复数的支持,并通过适当的功能测试宏强制执行。由于Windows堆的性质,缺少对aligned_alloc的支持。另一种方法是使用_aligned_malloc。此外,由于可能破坏ABI的realloc更改,目前尚未实现DR400支持。也不支持VLA。可变长度数组的效率通常低于可比较的固定大小数组,并且在安全可靠地实现时,通常低于等效数组的效率。VLA有gets()安全问题,可以通过“移动堆栈”和其他方式加以利用。由于这些原因,VLA支持只是一项可选功能。基本设置为了在程序中使用C11或C17,需要最新的WindowsSDK更新才能使用兼容的预处理器(/Zc:preprocessor)和新的通用C运行时。WindowsSDK版本对应于Windows操作系统版本。由于相应的Windows版本没有改变,因此需要一个InsiderPreviewWindowsSDK——一个与当前为WindowsInsiders发布的Windows版本对应的预览版WindowsSDK。请注意,安装InsiderPreviewWindows10SDK后,配置为使用最新WindowsSDK的VisualStudio项目将使用InsiderPreview。登录MicrosoftInsider任何人都可以创建一个免费的Microsoft帐户,然后选择加入Insider程序,“注册”并登录。注册后,您将可以选择开始运行Windows的Insider版本,但下载并且不需要使用InsiderWindows10SDK。单击此页面后,您无需单击“立即飞行”。继续下一步并下载InsiderPreviewWindows10SDK。下载InsiderPreviewWindows10SDKInsiderPreviewWindowsSDK可以从软件下载/windowsinsiderpreviewSDK安装。Insider页面描述了使用Windows10InsiderPreview操作系统的必要性。WindowsSDK中包含的某些内容确实如此,具体取决于早期版本的Windows中不存在的新API,但Windows和通用C运行时标头将正确安装并且可以在没有InsiderOS的情况下使用。点击“GetSDKInsiderPreview-Build20206”开始下载。WindowsSDK的未来版本也可以使用。安装InsiderPreviewWindows10SDKInsiderPreviewWindowsSDK将作为.iso文件下载。挂载.iso文件并运行WinSDKSetup.exe开始安装。选择在您的计算机上安装Windows软件开发工具包,然后单击下一步。必须选择允许深入了解WindowsSDK的使用,并且必须在到达功能安装页面之前接受许可协议。唯一应该安装的功能(除非使用Windows10的InsiderPreview构建):用于桌面应用程序的WindowsSDK签名工具用于UWP托管应用程序的WindowsSDK用于UWPC++应用程序的WindowsSDK用于桌面C++x86应用程序的WindowsSDK(为x86构建)WindowsSDKforDesktopC++arm64Apps(buildforarm64)WindowsSDKforDesktopC++ARMApps(buildforARM)SDK需要几分钟安装,然后您可以打开VisualStudio16.8Preview3.配置C11或C17模式以支持C11VisualStudio16.8Preview3中的C17和C17。您可以直接下载最新的Preview版本。在项目中,打开“属性”页。确保该项目将使用InsidersPreviewWindow10SDK。将WindowsSDK版本设置为10.0.20206.0(或您刚刚安装的最新InsiderPreviewWindows10SDK)。您将能够看到一个新选项:C语言标准。当语言为C++时,使用C++语言标准,当文件扩展名为.cpp时,为默认设置。当语言为C时,使用C语言标准版,扩展名为.c,默认使用c版本。为确保您使用C11或C17构建项目,您必须确保它是一个文件,或者在“属性”选项卡中将代码设置为编译为C。这些项目更改后,您可以使用C11和C17进行测试。综上所述,支持C11和C17,对于使用VSWindows的开发者来说是个好消息,希望大家可以尝试一下。