热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c17语言标准,官宣:MSVC新加入C11和C17标准

原标题:官宣:MSVC新加入C11和C17标准官宣我们很高兴的宣布,从VisualStudio2019v16.8Preview3开始&#x


原标题:官宣: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》


责任编辑:




推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • C++构造函数与初始化列表详解
    本文深入探讨了C++中构造函数的初始化列表,包括赋值与初始化的区别、初始化列表的使用规则、静态成员初始化等内容。通过实例和调试证明,详细解释了初始化列表在对象创建时的重要性。 ... [详细]
author-avatar
mobiledu2502940265
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有