本文由 简悦SimpRead 转码,原文地址 [devblogs.microsoft.com] (devblogs.microsoft.com/cppblog/c11…)
请参阅我们的Visual Studio 2019版16.8预览版3发布说明,了解更多最新功能......。
请参见我们的Visual Studio 2019版16.8预览版3发布说明,了解更多我们的最新功能。
更新:Windows 10 SDK 2104版本已经发布,其中包括C11和C17以及符合要求的预处理程序所需的变化。它可以被下载这里。要使用这个SDK,请按照步骤3.的说明进行操作。
我们的团队很高兴地宣布,从Visual Studio 2019的16.8预览版开始,C11和C17将成为MSVC编译器工具集的支持语言版本!
多年来,Visual Studio只支持C语言,以至于它是C++的必需品。现在情况即将发生变化,因为编译器中已经添加了一个符合要求的基于令牌的预处理器。随着两个新的编译器开关的出现,/std:c11和/std:c17,我们正式支持最新的ISO C语言标准。
有什么:
支持C11和C17的所有必要功能。这意味着增加了以下功能。
_Pragmarestrict(限制)_Noreturn和<stdnoreturn.h>。_Alignas,_Alignof和stdalign.h>._Generic和<tgmath.h>支持_Static_assert支持
IntelliSense也可以与这些功能一起使用,只需为你的源文件使用.c文件扩展名或/TC编译器开关就可以启用C代码的语法高亮。
目前IntelliSense高亮显示只适用于关键词,而不是标准头文件引入的宏。这将在以后的版本中得到修正。
由于C17本质上只是ISO C的一个错误修复版本,许多缺陷报告被采纳,我们对C11的支持已经包括所有相关的缺陷报告。目前,除了__STDC_VERSION__宏,扩展为 201112L(针对C11)和 201710L(针对C17)外,C11和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);
}
自从包含了基于令牌的conformant preprocessor,这两个新的C编译器开关就意味着/Zc:preprocessor。如果你想在C11或C17旁边使用传统的、基于字符的预处理器,你将需要明确地传入/Zc:preprocessor-编译器开关。我们鼓励你在必要时修改你的源代码,使之不依赖传统的预处理器。
什么不是:
虽然目前不支持任何C11的可选特性,但我们致力于在未来的版本中提供最有影响的可选特性。原子和线程支持已经在我们的路线图上。对复数的支持目前还没有计划,它们的缺席是通过适当的功能测试宏来执行的。请到Visual Studio开发者社区,表达你对希望实现的功能的支持。我们正在寻找您的意见,以确保我们做出正确的优先选择。
由于Windows堆的性质,缺少对 "aligned_alloc "的支持。替代方法是使用[_aligned_malloc](docs.microsoft.com/en-us/cpp/c…
此外,DR400对realloc的支持目前还没有实现,因为这种改变会破坏ABI。
可变长度数组
精明的读者会注意到,变长数组也不被支持。可变长度数组的效率通常低于类似的固定大小的数组,而且在安全和可靠的情况下,与同等的malloc()相比,通常效率较低。VLAs提供了与那些臭名昭著的gets()相媲美的攻击载体--已被废弃并注定要被删除--以获得 "转移堆栈 "和其他利用的机会。由于这些原因,我们不打算在C11中支持VLAs作为一个可选的功能。
C11和C17:入门
为了在你的程序中使用C11或C17,需要最新的Windows SDK更新,以便与符合要求的预处理器(/Zc:preprocessor)和新的通用C语言运行时正常工作。Windows SDK的发布与Windows操作系统的发布相对应。由于没有Windows版本的这些变化,你将需要一个Insider Preview Windows SDK - 一个对应于目前正在为Windows Insiders飞行的Windows版本的预览版Windows SDK。请注意,安装Insider Preview Windows 10 SDK后,配置为使用最新Windows SDK的Visual Studio项目将使用Insider Preview。
第1步:用内部人士的微软账户登录
任何人都可以创建一个免费的微软账户(signup.live.com/),然后选择加入内幕计划。只需进入insider.windows.com/en-us/for-d…,点击 "注册 "并登录。
注册后,您将获得开始飞行内幕版本Windows的选项,但这不是下载和使用内幕Windows 10 SDK的必要条件。注册并不能自动选择在您的机器上下载新的Windows飞行。
一旦你打到这个页面,你不***需要点击'现在飞行'。继续进行下一步,下载Insider Preview Windows 10 SDK。
第2步:下载内幕预览Windows 10 SDK
Insider Preview Windows SDK可以从www.microsoft.com/en-us/softw…安装。如果你收到的不是这个页面,请确保你已经用你的微软账户登录,并选择成为内幕人士。
Insider页面描述,使用Windows 10 Insider Preview操作系统是必须的。这对于Windows SDK中包含的一些内容来说是真实的,因为它们可能依赖于旧版Windows中不存在的新API,但Windows和Universal C Runtime头文件将正确安装,并且在没有Insider OS的情况下也可以使用。
点击 "获取SDK Insider Preview - Build 20206 "开始下载。未来版本的Windows SDK也可以使用。
第三步:安装内幕预览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
- 用于桌面C++ x86应用程序的Windows SDK(如果计划为x86构建)。
- 用于桌面C++ amd64应用程序的Windows SDK(如果计划为amd64构建)。
- 用于桌面C++ arm应用程序的Windows SDK(如果计划为arm构建)。
- 用于桌面C++ arm64应用程序的Windows SDK(如果计划为arm64构建)。
SDK将花几分钟时间完成安装,然后你可以打开Visual Studio 16.8 Preview 3。
第4步:在Visual Studio 16.8 Preview 3中配置C11或C17模式[](#step-4-configuring-c11 or-c17-mode-in-visual-studio-16-8-preview-3)
对C11和C17的支持从Visual Studio 16.8 Preview 3开始。你可以通过visualstudio.microsoft.com/vs/preview/ 下载最新的Preview。
在你的项目中,打开 "属性 "页面。首先,我们要确保该项目将使用Insiders Preview Window 10 SDK。将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上找到我们(@VisualC)。