[C翻译]C11和C17标准支持在MSVC中出现

818 阅读8分钟

本文由 简悦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的所有必要功能。这意味着增加了以下功能。

  • _Pragma
  • restrict(限制)
  • _Noreturn<stdnoreturn.h>
  • _Alignas, _Alignofstdalign.h>.
  • _Generic<tgmath.h>支持
  • _Static_assert支持

IntelliSense也可以与这些功能一起使用,只需为你的源文件使用.c文件扩展名或/TC编译器开关就可以启用C代码的语法高亮。

image.png

目前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…,点击 "注册 "并登录。

image.png

注册后,您将获得开始飞行内幕版本Windows的选项,但这不是下载和使用内幕Windows 10 SDK的必要条件。注册并不能自动选择在您的机器上下载新的Windows飞行。

image.png

一旦你打到这个页面,你不***需要点击'现在飞行'。继续进行下一步,下载Insider Preview Windows 10 SDK。

第2步:下载内幕预览Windows 10 SDK

Insider Preview Windows SDK可以从www.microsoft.com/en-us/softw…安装。如果你收到的不是这个页面,请确保你已经用你的微软账户登录,并选择成为内幕人士。

image.png

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 "文件的形式下载。

image.png

挂载.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)。

image.png

你还会看到一个新的选项。C语言标准。将此设置为ISO C11标准(/std:c11)或ISO C17(2018)标准(/std:c17)。

image.png

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

image.png

经过这些项目的修改,你就可以测试C11和C17了!

总结

我们很高兴终于支持C11和C17了!这是个很好的机会。作为投票率最高的开发者社区建议,我们相信你也很兴奋。如果你想支持C11的可选功能,请在开发者社区上告诉我们。

一如既往,我们欢迎你的反馈。可以通过下面的评论或电子邮件(visualcpp@microsoft.com)联系我们。如果你遇到Visual Studio或MSVC的问题,或者对我们有什么建议,请通过帮助>发送反馈>报告问题/提供产品中的建议,或者通过开发者社区让我们知道。你也可以在Twitter上找到我们(@VisualC)。


www.deepl.com 翻译