MSVC宣布支持C11和C17标准

开发 前端
日前微软VS团队宣布,将在Visual Studio 2019版本16.8预览版3开始,正式支持C11和C17为MSVC编译器。

日前微软VS团队宣布,将在Visual Studio 2019版本16.8预览版3开始,正式支持C11和C17为MSVC编译器。多年来,Visual Studio仅在C++要求的范围内支持C。随着两个新的编译器开关/std:c11和/std:c17的出现,VS将正式支持最新的ISO C语言标准。

MSVC宣布支持C11和C17标准

概述

支持C11和C17的所有必需功能,将会添加这些功能:_Pragma,restrict,_Noreturn和,_Alignas,_Alignof和,_Generic和,_Static_assert

IntelliSense本身也具有这些功能,只需为源文件使用.c文件扩展名或/TC编译器开关即可为C代码启用语法突出显示。

MSVC宣布支持C11和C17标准

IntelliSense高亮仅适用于关键字,不适用于标准标头引入的宏。由于C17本质上只是ISO C的错误修复版本,并且采用了许多缺陷报告,因此对C11的支持已经包括所有相关的缺陷报告。目前,C11和C17版本之间没有什么区别,除了__STDC_VERSION__宏,该宏扩展为201112L(对于C11)和201710L(对于C17)。

这是显示这些功能的示例:

  1. #include <assert.h> 
  2. #include <stdalign.h>#include <stdlib.h>#include <stdnoreturn.h>#define NO_WARN(X) _Pragma("warning (push)") _Pragma("warning (disable: 4146)") X;  _Pragma("warning (pop)") 
  3. #define store(x, y) _Generic((x), data*: stored, int* : storei)(x, y) 
  4. typedef struct data { 
  5. _Alignas(8) unsigned int i; 
  6. } data; 
  7. static_assert(alignof(data) == 8, "data is not properly aligned"); 
  8. void stored(data* restrict dst, const data* restrict src) 
  9. {// Do not trigger warning 4245 
  10. dst->i = NO_WARN(-(src->i)); 
  11. void storei(int* restrict dst, const int* restrict src) 
  12. *dst = *src; 
  13. noreturn void my_exit(int ret) { 
  14. exit(ret); 
  15. int main() { 
  16. data src, dst; 
  17. src.i = 5
  18. int i, j; 
  19. i = 10
  20. store(&src, &dst); 
  21. store(&i, &j); 
  22. my_exit(0); 

由于包含了基于令牌的一致性预处理器,因此这两个新的C编译器开关暗示/Zc:preprocessor。如果要与C11或C17一起使用基于字符的传统预处理器,则需要显式传递编译器开关/Zc:preprocessor-。

尽管目前不支持任何C11可选功能,会在将来的版本中提供最具影响力的可选功能。原子和线程支持在我们的路线图上。目前尚不支持对复数的支持,并且通过适当的功能测试宏来强制不支持复数。

由于Windows堆的性质,缺少对aligned_alloc的支持。另一种方法是使用_aligned_malloc。

此外,由于realloc更改可能会破坏ABI,因此目前尚未实现DR 400支持。

同时也不支持VLA。可变长度数组通常比可比的固定大小数组效率低,并且在安全可靠地实现时,与等效数组相比效率通常较低。VLA存在gets()安全问题,可以被 "转移堆栈"和其他的利用。由于这些原因,VLA支持仅仅为可选功能。

基本设置

为了在程序中使用C11或C17,需要最新的Windows SDK更新才能与兼容的预处理器(/Zc:preprocessor)并在新的Universal C Runtime下工作。Windows SDK版本与Windows OS版本相对应。由于没有更改对应的Windows版本,因此需要一个Insider Preview Windows SDK-Windows SDK的预览版本,该版本与当前为Windows Insiders发行的Windows版本相对应。注意,在安装Insider Preview Windows 10 SDK之后,配置为使用最新Windows SDK的Visual Studio项目将使用Insider Preview。

登陆Microsoft Insider

任何人都可以创建一个免费的Microsoft帐户,然后选择加入Insider程序, "注册"并登录。

MSVC宣布支持C11和C17标准

注册后,将提供开始运行Insider版本的Windows的选项,但是下载和使用Insider Windows 10 SDK是非必须的。

MSVC宣布支持C11和C17标准

一旦你点击这个页面,你就不会需要点击"Flight now"。继续进行下一步,并下载Insider Preview Windows 10 SDK。

下载Insider Preview Windows 10 SDK

可以从software-download/windowsinsiderpreviewSDK安装Insider Preview Windows SDK。

MSVC宣布支持C11和C17标准

Insider页面描述了需要使用Windows 10 Insider Preview OS。对于Windows SDK中包含的某些内容,这是正确的,取决于Windows的较早版本中不存在的新API,但是Windows和Universal C Runtime标头将正确安装并且在没有Insider OS的情况下可用。

点击"获取SDK Insider预览-内部版本20206"开始下载。Windows SDK的将来版本也将起作用。

安装Insider Preview Windows 10 SDK

Insider Preview Windows SDK将作为.iso文件下载。

MSVC宣布支持C11和C17标准

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

MSVC宣布支持C11和C17标准

选择在计算机上安装Windows软件开发套件,然后单击下一步。必须选择是否允许深入了解Windows SDK的使用,并且必须接受许可协议,然后才能到达功能部件安装页面。应该安装的唯一功能(除非使用Windows 10的Insider Preview构建):

  • 适用于桌面应用程序的Windows SDK签名工具
  • 适用于UWP托管应用程序的Windows SDK
  • 适用于UWP C ++应用程序的Windows SDK
  • Windows SDK for Desktop C++ x86应用程序(为x86进行构建)
  • Windows SDK for Desktop C++ arm64应用程序(为arm64构建)
  • Windows SDK for Desktop C++ ARM应用程序(为ARM构建)
MSVC宣布支持C11和C17标准

SDK将花费几分钟的时间来完成安装,然后就可以打开Visual Studio 16.8 Preview 3。

配置C11或C17模式

为了在Visual Studio 16.8 Preview 3中支持C11和C17。可以直接载最新的Preview版本。

在项目中,打开"属性"页面。确保该项目将使用Insiders Preview Window 10 SDK。将Windows SDK版本设置为10.0.20206.0(或刚刚安装的最新的Insider Preview Windows 10 SDK)。

MSVC宣布支持C11和C17标准

将能看到一个新选项:C语言标准。

MSVC宣布支持C11和C17标准

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

MSVC宣布支持C11和C17标准

这些项目更改之后,就可以测试使用C11和C17。

总结

支持C11和C17,这对使用VS Windows的开发者来说是个好消息,希望大家尝鲜使用。

 

责任编辑:赵宁宁 来源: 今日头条
相关推荐

2020-06-01 21:07:33

C11C++11内存

2019-09-18 09:05:26

微软开源Windows

2022-03-01 08:58:10

Linux 内核C11GNU 方言

2021-04-12 10:38:51

CC++谷歌

2022-02-25 14:13:28

LinuxC语言开发

2012-12-25 10:52:23

IBMdW

2011-10-13 10:21:01

C++

2013-09-25 14:20:46

2022-02-25 14:51:39

LinuxC语言Linux 内核

2022-02-25 15:49:08

Linux开源社区C语言C11

2013-03-18 09:42:47

C++C++ 11

2009-06-23 21:11:35

Linux

2011-11-01 09:29:52

LinuxWindows开源软件

2012-02-15 09:36:50

C++ 11

2013-05-30 00:49:36

C++11C++条件变量

2023-12-18 09:26:12

C++switchif

2023-05-24 10:39:30

Windows 11微软

2021-01-28 15:25:11

W3CIETFWebRTC

2020-11-05 13:00:07

C语言编程语言

2009-08-04 14:14:11

C#编码标准
点赞
收藏

51CTO技术栈公众号