C11和C17标准支持到达MSVC

请看我们的 Visual Studio 2019版本16.8预览版3发行说明 了解更多最新功能。

null

更新: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代码的语法高亮显示。

图片[1]-C11和C17标准支持到达MSVC-yiteyi-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- 编译器开关显式。我们鼓励您在需要时修复源代码,而不依赖传统的预处理器。

什么不是:

虽然目前不支持任何C11可选功能,但我们承诺在未来的版本中提供最具影响力的可选功能。原子和线程支持在我们的路线图上。目前还没有计划对复数的支持,它们的缺失是通过适当的功能测试宏来实现的。请到 Visual Studio开发人员社区 并对希望实现的功能表示支持。我们正在寻找您的意见,我们正在作出正确的优先顺序。
由于Windows堆的性质, aligned_alloc 缺少支持。另一种方法是使用 _对齐u malloc .

此外,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 然后单击“注册”并登录。

图片[2]-C11和C17标准支持到达MSVC-yiteyi-C++库

注册后,您将可以选择开始使用Windows的Insider版本,但下载和使用Insider Windows 10 SDK时不需要这样做。注册不会自动选择在您的计算机上下载新的Windows航班。

图片[3]-C11和C17标准支持到达MSVC-yiteyi-C++库

一旦你点击了这一页,你就知道了 需要单击“航班现在”。继续下一步,下载Windows 10 SDK内部预览版。

第二步:下载预览版windows10sdk

可以从以下位置安装Insider预览Windows SDK https://www.microsoft.com/en-us/software-download/windowsinsiderpreviewSDK . 如果这不是您收到的页面,请确保您是使用您的Microsoft帐户登录的,该帐户已被选为内部人员。 图片[4]-C11和C17标准支持到达MSVC-yiteyi-C++库

Insider页面描述需要使用Windows10Insider预览操作系统。对于Windows SDK中包含的某些内容来说,这是正确的,因为它们可能依赖于旧版本Windows中不存在的新api,但是Windows和Universal C运行时头将正确安装,并且在没有内部操作系统的情况下可用。

单击“Get SDK Insider Preview–Build 20206”开始下载。Windows SDK的未来版本也将起作用。

步骤3:安装Insider预览版Windows10SDK

Windows SDK预览版将作为 .iso 文件。

图片[5]-C11和C17标准支持到达MSVC-yiteyi-C++库

安装 .iso 文件并运行WinSDKSetup.exe开始安装。

图片[6]-C11和C17标准支持到达MSVC-yiteyi-C++库

选择在此计算机上安装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上进行规划)

图片[7]-C11和C17标准支持到达MSVC-yiteyi-C++库

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)。

图片[8]-C11和C17标准支持到达MSVC-yiteyi-C++库

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

图片[9]-C11和C17标准支持到达MSVC-yiteyi-C++库

当C++为语言时使用C++语言标准——当文件扩展名为默认时,这将是默认的。 .cpp . 当语言为C时使用C语言标准版本–当文件扩展名为 .c . 要确保项目是使用C11或C17构建的,必须确保它是 .c 文件,或在“属性”选项卡中将代码设置为编译为C。

图片[10]-C11和C17标准支持到达MSVC-yiteyi-C++库

在这些项目更改之后,就可以测试C11和C17了!

总之

我们非常高兴终于支持C11和C17!作为投票率最高的开发者社区建议,我们相信你也很兴奋。如果您想支持C11的可选功能,请告诉我们 开发者社区 .

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

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享