热门标签 | 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》


责任编辑:




推荐阅读
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 在Java中,this是一个引用当前对象的关键字。如何通过this获取并显示其所指向的对象的属性和方法?本文详细解释了this的用法及其背后的原理。 ... [详细]
  • C++构造函数与初始化列表详解
    本文深入探讨了C++中构造函数的初始化列表,包括赋值与初始化的区别、初始化列表的使用规则、静态成员初始化等内容。通过实例和调试证明,详细解释了初始化列表在对象创建时的重要性。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 本文详细探讨了C语言中指针的概念,特别是指针在变量和数组中的应用。通过实例讲解,帮助读者更好地掌握指针的使用方法。 ... [详细]
  • 本文介绍了几种不同的编程方法来计算从1到n的自然数之和,包括循环、递归、面向对象以及模板元编程等技术。每种方法都有其特点和适用场景。 ... [详细]
  • Python入门:第一天准备与安装
    本文详细介绍了Python编程语言的基础知识和安装步骤,帮助初学者快速上手。涵盖Python的特点、应用场景以及Windows环境下Python和PyCharm的安装方法。 ... [详细]
  • 本文探讨了高质量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社区 版权所有