请看我们的 Visual Studio 2019版本16.8预览版3发行说明 了解更多最新功能。
更新:windows10sdkversion2104已经发布,包括C11和C17所需的更改以及一致的预处理器。可以下载 在这里 . 要使用此SDK,请按照步骤3中的说明进行操作。
我们的团队很高兴地宣布,从VisualStudio2019版本16.8预览版3开始,C11和C17将成为MSVC编译器工具集中受支持的语言版本!
多年来VisualStudio只支持C++对C++所需的程度。现在,编译器中添加了一个一致的基于令牌的预处理器,事情就要改变了。随着两个新的编译器开关的出现, /std:c11
和 /std:c17
,我们正式支持最新的isoc语言标准。
内容:
支持C11和C17的所有必需功能。这意味着要添加以下功能:
-
_Pragma
-
restrict
-
_Noreturn
和<stdnoreturn.h>
-
_Alignas
,_Alignof
和<stdalign.h>
-
_Generic
和<tgmath.h>
支持 -
_Static_assert
IntelliSense本身也具有这些功能,只需使用 .c
源文件的文件扩展名或 /TC
编译器开关以启用C代码的语法高亮显示。
当前IntelliSense高亮显示仅适用于关键字,而不适用于标准标头引入的宏。这将在以后的版本中修复。
由于C17本质上只是isoc的一个bug修复版本,采用了许多缺陷报告,因此我们对C11的支持已经包括了所有相关的缺陷报告。目前,C11和C17版本之间除了 __STDC_VERSION__
宏,扩展到 201112L
(对于C11)和 201710L
(对于C17)。
下面是一个显示这些功能的示例:
#include <assert.h> #include <stdalign.h> #include <stdlib.h> #include <stdnoreturn.h> #define NO_WARN(X) _Pragma("warning (push)") _Pragma("warning (disable: 4146)") X; _Pragma("warning (pop)") // Pick stored or storei based on the type of the dst #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 4245 dst->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-
编译器开关显式。我们鼓励您在需要时修复源代码,而不依赖传统的预处理器。
什么不是:
此外,DR 400支持目前还没有针对 realloc
因为这个改变会打破ABI。
可变长度数组
精明的读者会注意到,vla也不受支持。可变长度阵列的效率通常低于可比的固定大小阵列,并且与等效阵列相比效率通常较低 malloc()
安全可靠地实施时。VLA提供的攻击向量可与臭名昭著的 gets()
-弃用和注定要删除-为“转移堆栈”和其他利用机会。基于这些原因,我们不打算将VLAs作为C11中的可选特性来支持。
C11和C17:入门
为了在程序中使用C11或C17,需要最新的Windows SDK更新才能与一致的预处理器正常工作( /Zc:preprocessor
),以及新的通用C运行时。Windows SDK版本与Windows OS版本相对应。由于没有Windows版本进行这些更改,因此您将需要一个内部预览版Windows SDK—一个与当前为Windows内部人员提供的Windows版本相对应的Windows SDK预览版本。请注意,安装Insider Preview Windows 10 SDK后,配置为使用最新Windows SDK的Visual Studio项目将使用Insider Preview。
步骤1:使用Microsoft内部帐户登录
任何人都可以创建免费的Microsoft帐户( https://signup.live.com/ )然后选择加入内部程序。只需转到 https://insider.windows.com/en-us/for-developers 然后单击“注册”并登录。
注册后,您将可以选择开始使用Windows的Insider版本,但下载和使用Insider Windows 10 SDK时不需要这样做。注册不会自动选择在您的计算机上下载新的Windows航班。
一旦你点击了这一页,你就知道了 不 需要单击“航班现在”。继续下一步,下载Windows 10 SDK内部预览版。
第二步:下载预览版windows10sdk
可以从以下位置安装Insider预览Windows SDK https://www.microsoft.com/en-us/software-download/windowsinsiderpreviewSDK . 如果这不是您收到的页面,请确保您是使用您的Microsoft帐户登录的,该帐户已被选为内部人员。
Insider页面描述需要使用Windows10Insider预览操作系统。对于Windows SDK中包含的某些内容来说,这是正确的,因为它们可能依赖于旧版本Windows中不存在的新api,但是Windows和Universal C运行时头将正确安装,并且在没有内部操作系统的情况下可用。
单击“Get SDK Insider Preview–Build 20206”开始下载。Windows SDK的未来版本也将起作用。
步骤3:安装Insider预览版Windows10SDK
Windows SDK预览版将作为 .iso
文件。
安装 .iso
文件并运行WinSDKSetup.exe开始安装。
选择在此计算机上安装Windows软件开发工具包,然后单击“下一步”。您必须选择是否允许深入了解Windows SDK的使用,并且必须在到达功能安装页之前接受许可协议。您应该安装的唯一功能(除非您使用的是Windows 10的内部预览版本)是:
- 用于桌面应用程序的Windows SDK签名工具
- UWP托管应用程序的Windows SDK
- UWP C++应用程序的Windows SDK
- Windows SDK桌面+ C++ x86应用程序(如果在x86的建筑规划)
- Windows SDK桌面+ C++ AMD64应用程序(如果在AMD64上进行规划)
- 桌面C++ C++ ARM应用程序的Windows SDK(如果为ARM构建规划)
- 用于桌面C++的ARM64应用程序的Windows SDK(如果在ARM64上进行规划)
SDK需要几分钟来完成安装,然后您可以打开VisualStudio16.8 Preview 3。
步骤4:在Visual Studio 16.8 Preview 3中配置C11或C17模式
对C11和C17的支持从Visual Studio 16.8 Preview 3开始。您可以通过下载最新的预览 https://visualstudio.microsoft.com/vs/preview/ .
在项目中,打开“属性”页。首先,我们要确保项目将使用内部预览windows10sdk。将Windows SDK版本设置为10.0.20206.0(或刚安装的最新预览版Windows 10 SDK)。
您还将看到一个新选项:C语言标准。将其设置为ISO C11标准( /std:c11
)或ISO C17(2018)标准( /std:c17
).
当C++为语言时使用C++语言标准——当文件扩展名为默认时,这将是默认的。 .cpp
. 当语言为C时使用C语言标准版本–当文件扩展名为 .c
. 要确保项目是使用C11或C17构建的,必须确保它是 .c
文件,或在“属性”选项卡中将代码设置为编译为C。
在这些项目更改之后,就可以测试C11和C17了!
总之
我们非常高兴终于支持C11和C17!作为投票率最高的开发者社区建议,我们相信你也很兴奋。如果您想支持C11的可选功能,请告诉我们 开发者社区 .
一如既往,我们欢迎您的反馈。我们可以通过下面的评论或电子邮件联系我们(visualcpp@microsoft.com). 如果您在Visual Studio或MSVC中遇到问题,或有任何建议,请通过“帮助”>“发送反馈”>“报告问题/在产品中提供建议”或通过 开发者社区 . 你也可以在Twitter上找到我们( @视觉 ).