MSVC宣布支持C11和C17标准

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

创新互联公司服务项目包括市北网站建设、市北网站制作、市北网页制作以及市北网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,市北网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到市北省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

概述

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

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

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

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

 
 
 
  1. #include 
  2. #include #include #include #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. }
  12. void storei(int* restrict dst, const int* restrict src)
  13. {
  14. *dst = *src;
  15. }
  16. noreturn void my_exit(int ret) {
  17. exit(ret);
  18. }
  19. int main() {
  20. data src, dst;
  21. src.i = 5;
  22. int i, j;
  23. i = 10;
  24. store(&src, &dst);
  25. store(&i, &j);
  26. my_exit(0);
  27. }

由于包含了基于令牌的一致性预处理器,因此这两个新的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程序, "注册"并登录。

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

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

下载Insider Preview Windows 10 SDK

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

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文件下载。

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

选择在计算机上安装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构建)

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

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

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

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

总结

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

文章名称:MSVC宣布支持C11和C17标准
文章来源:http://www.shufengxianlan.com/qtweb/news36/74636.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联