c17 语言标准,官宣:MSVC新加入C11和C17标准-程序员宅基地

技术标签: c17 语言标准  

原标题:官宣:MSVC新加入C11和C17标准

官宣

我们很高兴的宣布,从Visual Studio 2019 v16.8 Preview 3开始,C11和C17这两个C语言版本将加入到MSVC编译器工具集(toolset)。

多年以来,Visual Studio仅仅是因为C++的需要才对C进行有限度的支持。现在,事情有转变了:我们在编译器中添加了一个基于token的规范化预处理器,借助于两项新加入的编译器开关:/std:c11和/std:c17,我们终于可以正式宣布Visual Studio可以支持最新版本的C语言标准了。

具体都有些什么东西?

所有C11和C17中的特性都将得到支持。这意味着我们会添加如下的功能:

> _Pragma

> restrict

> _Noreturn 和

> _Alignas, _Alignof 和

> _Generic 和 support

> _Static_assert

IntelliSense组件将和这些特性无缝集成,你只需要将你的源代码文件命名为.c结尾,或者使用编译器开关/TC来启用语法高亮显示,如下图所示:

624ed60a25fda97743e74506a48f1108.png

目前IntelliSense仅支持关键字的高亮显示,还不能处理标准头文件中的宏,这个问题将在后面的版本中修复。

因为C17本质上只是对ISO C的一个Bug修复,另外还增加了大量的缺陷报告处理。我们对C11的支持已经包含了这些相关的缺陷处理,除了__STDC_VERSION__这个宏的定义有所不同以外,我们对C11和C17的支持基本没有什么不同。在C11中,__STDC_VERSION__被定义为201112L,C17中它被定义为201710L。

下面是一个简单的例子,它演示了上面所提到的一些功能特性:

02752b5bc911e3aeb9f7a101c942d322.png

2a3fe96b97648fc9c7ef1d57f5d0b825.png

因为引入了基于Token的规范化预处理器,上面提到的两个C编译器开关都隐式包含/Zc:preprocessor选项。如果你还是想使用传统的,基于字符的预处理器,你可以使用/Zc:preprocessor-这个开关来回到旧的模式。但是我们鼓励你能尽可能的修改代码,使之不再依赖旧的工作模式。

尚未支持的特性

当前不支持任何C11中的可选特性,但是我们还是会在将来的某个版本中提供那些影响力比较大的可选特性。在我们的路线图中,原子性(Atomic)和线程(Threading)已经提上日程。当前还不支持复数(Complex numbers),但是可以通过一些合适的测试宏来进行模拟。你可以告诉我们你想要哪些功能,这样我们就可以给它们排上优先级。

由于Windows堆的一些特性,aligned_alloc还不支持,作为替代的,可以使用_aligned_malloc。

另外,对于realloc的DR 400支持在当前版本中也尚未实现,因为这个可能会破坏ABI。

可变长数组

VLA(Variable Length Arrays,可变长数组)是C11中的一个可选特性,细心的读者可能也注意到了:VLA也是不支持的。从性能上来说,VLA没有定长数组好,同时当启用了安全检查时,VLA也不如malloc()。同时VLA还为潜在的攻击者提供了”Shifting the stack”漏洞利用机会和其他的一些安全隐患。基于这些原因,我们决定还是暂不支持VLA特性。

C11 和 C17 入门

为了在程序中使用C11或者C17,你可能需要安装最新版本的Windows SDK,SDK中包含了所需要的预处理器(/Zc:preprocessor)和新的通用C运行时库。

一般来说,Windows SDK和Windows系统一起发布,因为正式版的Windows还没有包含这些新特性,所以你需要下载预览版的Windows SDK(用于提供给Windows Insider的Windows SDK预览版本)。

请注意,当安装了预览版SDK后,在Visual Studio中配置了使用最新版Windows SDK的工程都会使用安装好的预览版SDK。

步骤1: 预览版SDK入口

下图是预览版SDK下载入口:

53a3e68f8f25fd0b15d5d92324157aaf.png

23c5682328826194dcd75e84b0f19ed1.png

步骤2: 下载预览版SDK

00d81059caba693422c41fe8c86d8087.png

步骤3:安装预览版SDK

6070f7412ee600f2218cfcaa14b8e2ac.png

c5a5b87bd66b8e92192a04dde0f0ca54.png

3d528891905501cf08f972af67f3d128.png

步骤4: 在Visual Studio v16.8 Preview 3中配置C11或者C17工作模式

首先打开工程属性,然后确保工程使用的SDK为预览版SDK。如下图所示,将Windows SDK版本设置为10.0.20206.0(或者设置最新安装版本)

090a77be4b4062fa984d9ff5ffca6ec2.png

在C Language Standard中,根据项目需要,可以将它设置为C11或者C17。

eedfdb8fa54f8eac55c5d5500a8d9a6d.png

为了确保代码使用C11或者C17编译,请将源文件命名为以.c结尾,或者设置编译以下编译选项:

274efb7d2fb1111f755ac2ba067c7341.png

恭喜恭喜:经过以上这些步骤之后,你就可以体验C11和C17啦。

最后

Microsoft Visual C++团队的博客是我非常喜欢的博客之一,里面有很多关于Visual C++的知识和最新开发进展。大浪淘沙,如果你对Visual C++这门古老的技术还是那么感兴趣,则可以经常去他们那(或者我这)逛逛。

本文来自:《C11 and C17 Standard Support Arriving in MSVC》

责任编辑:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39989033/article/details/117113507

智能推荐

序列模型(RNN-GRU-LSTM-BRNN-Deep RNN)_brnn 向量 序列-程序员宅基地

文章浏览阅读5.4k次,点赞2次,收藏16次。LSTM原理,应用。从循环神经网络(Recurrent Neural Network,RNN)可以通过许多不同的方式建立,但就像几乎所有函数都可以被认为是前馈网络,基本上任何涉及循环的函数可以被认为是一个循环神经网络。它的基本结构以及其展开的理解如下图所示: 同一网络被视为展开的计算图,其中每个节点现在与一个特定的时间实例相关联................_brnn 向量 序列

什么是深度学习,深度学习和机器学习有什么关系?_深度学习,是机器学习的一种特定技术,称其为深度,是因为他有()结构。-程序员宅基地

文章浏览阅读3.2k次。深度学习的概念源于人工神经网络的研究。含多隐层的多层感知器就是一种深度学习结构。深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。晦涩难懂的概念,略微有些难以理解,但是在其高冷的背后,却有深远的应用场景和未来。深度学习是实现机器学习的一种方式或一条路径。其动机在于建立、模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据。比如其按特定的物理距离连接;..._深度学习,是机器学习的一种特定技术,称其为深度,是因为他有()结构。

bootstrap tab切换后,刷新 页面 回到被选中的tab页签_bootstrap刷新页面-程序员宅基地

文章浏览阅读686次。描述:当使用bootstrap 的tab 进行页面切换后,一刷新页面,又回到了第一个初始页,从而又得重新切换,实现目标:例如当前切换到第三个页面后,刷新页面自动定位到第三个tab页面中。_bootstrap刷新页面

uniapp视频播放器(h5+app)

这是关于一篇在uniapp使用video视频播放器,支持自定义播放器样式,支持手势操作,选集、倍数和清晰度切换,支持SRT字幕格式。

uCosii从任务的建立到运行_ucosii用户任务中都有参数初始化,先执行哪个-程序员宅基地

文章浏览阅读823次。μC/OS-Ⅱ从任务的建立到运行提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、任务建立到运行整体流程二、分步功能实现1.μC/OS-Ⅱ初始化2.读入数据总结前言最近在学习ucosii实时操作系统,记录下学习过程,以待日后查阅.tips:本文所用ucosii版本为V2.86,硬件平台为STM32.一、任务建立到运行整体流程μC/OS-Ⅱ任务从建立到运行的整体流程如下所述:1. μC/OS-Ⅱ初始化: OSInit();2. 创建任务: Create_T_ucosii用户任务中都有参数初始化,先执行哪个

【燃料电池】燃料电池并网以最大额定功率运行研究(Simulink实现)_如何实现燃料电池大规模并网-程序员宅基地

文章浏览阅读260次。控制和电流谐振控制方法,增强了系统的稳定性,提高了供电质量。部分文献针对风力发电、太阳电池并网系统的小干扰稳定性进行研究,对燃料电池发电系统稳定性分析具有一定指导意义。文献[6,7]则分别建立太阳电池和风力发电系统的小信号模型,利用特征值分析法对系统的小干扰稳定性进行分析。文献[8]在光伏发电系统控制器参数进行全局优化以提高系统稳定性,但只考虑特征值作为单一优化目标,没有考虑阻尼比对系统稳定的影响,影响了控制参数的优化效果。在该模型中,燃料电池连接到电网,并由基于功率的控制器控制。行百里者,半于九十。_如何实现燃料电池大规模并网

随便推点

逆向_base64_rc4_----笔记_mdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmd-程序员宅基地

文章浏览阅读1k次。新人…学校比赛,没什么经验,上去见见世面某公司的月赛题 资源就不放了,只是当笔记Ida打开 有点小陷阱 巧妙的堆栈运用导致载入ida分析不了 得不到函数的边界比较幸运win32的程序od打开走一遍流程感受下00AD12E7 . 52 push edx00AD12E8 . 68 C821AD00 push 5ba358a4.00AD21C8 ..._mdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdawmdaw

致 Tapdata 开源贡献者:聊聊 2022 年的进展和新一年的共建计划-程序员宅基地

文章浏览阅读781次。在内、外部开发者的合力之下,过去一年 Tapdata 新增数据源近20个,实现了60+数据源的接入能力。一个人可以走得很快,一群人可以走得更远,2023年期待与您共创更受欢迎的开源项目。_tapdata

python列表添加元素的三种方法定义集合数据对象_python 学习第三天 可迭代对象(列表,字典,元组和集合)...-程序员宅基地

文章浏览阅读642次。列表,字典,元组和集合列表 list列表是由一系列特定元素组成的,元素和元素之间没有任何关联关系,但他们之间有先后顺序关系列表是一种容器列表是序列的一种列表是可以被改变的序列Python中的序列类型简介(sequence)字符串(str) 列表(list) 元组(tuple) 字节串(bytes) 字节数组(bytearray)创建空列表的字面值L = [ ] # L绑定空列表创建非空列表: L ..._python 集合 对象元素

第十五周 项目 1 - 验证算法_insertht(hashtable ha[], int& n, int m, int p, key-程序员宅基地

文章浏览阅读316次。/* *Copyright (c) 2016,烟台大学计算机学院 *All right reserved. *文件名称:test.cpp *作者:杨天瑞 *完成日期:2016年12月16日 *版本号:v1.7.5 * * 问题描述:验证算法。 * 程_insertht(hashtable ha[], int& n, int m, int p, keytype k)

react-native之项目结构分析_react native课程的项目分析-程序员宅基地

文章浏览阅读6k次,点赞5次,收藏10次。前言庖丁为文惠君解牛,手之所触,肩之所倚,足之所履,膝之所踦,砉然响然,奏刀騞然,莫不中音。合于桑林之舞,乃中经首之会。熟悉项目的结构,是开发的基本也是技术提升的一个重要途径,现总结下自己对react-native项目结构的分析与理解。正文项目结构init 的一个项目结构如图:tests:测试文件夹,执行命令 “npm test”会调用此文件夹,在文件夹中需要引入待测试文件。android:An_react native课程的项目分析

uniapp开发公众号,微信开发者工具进行本地调试_uniapp使用微信开发者工具 利用公众号调试的方法-程序员宅基地

文章浏览阅读584次。uniapp开发公众号,微信开发者工具进行本地调试_uniapp使用微信开发者工具 利用公众号调试的方法