CppGuide社区 CppGuide社区
首页
  • 🔥最新谷歌C++风格指南(含C++17/20)
  • 🔥C++17详解
  • 🔥C++20完全指南
  • 🔥C++23快速入门
🔥C++面试
  • 第1章 C++ 惯用法与Modern C++篇
  • 第2章 C++开发工具与调试进阶
  • 第3章 C++多线程编程从入门到进阶
  • 第4章 C++网络编程重难点解析
  • 第5章 网络通信故障排查常用命令
  • 第6章 网络通信协议设计
  • 第7章 高性能服务结构设计
  • 第8章 Redis网络通信模块源码分析
  • 第9章 服务其他模块设计
  • 🚀 全部章节.pdf 下载 (opens new window)
  • 🔥C++游戏编程入门(零基础学C++)
  • 🔥使用C++17从零开发一个调试器 (opens new window)
  • 🔥使用C++20从零构建一个完整的低延迟交易系统 (opens new window)
  • 🔥使用C++从零写一个C语言编译器 (opens new window)
  • 🔥从零用C语言写一个Redis
  • leveldb源码分析
  • libevent源码分析
  • Memcached源码分析
  • TeamTalk源码分析
  • 优质源码分享 (opens new window)
  • 🔥远程控制软件gh0st源码分析
  • 🔥Windows 10系统编程
  • 🔥Linux 5.x内核开发与调试 完全指南 (opens new window)
  • TCP源码实现超详细注释版.pdf (opens new window)
  • 高效Go并发编程
  • Go性能调优
  • Go项目架构设计
  • 🔥使用Go从零开发一个数据库
  • 🔥使用Go从零开发一个编译器 (opens new window)
  • 🔥使用Go从零开发一个解释器 (opens new window)
Rust编程指南
  • SQL零基础指南
  • MySQL开发与调试指南
GitHub (opens new window)
首页
  • 🔥最新谷歌C++风格指南(含C++17/20)
  • 🔥C++17详解
  • 🔥C++20完全指南
  • 🔥C++23快速入门
🔥C++面试
  • 第1章 C++ 惯用法与Modern C++篇
  • 第2章 C++开发工具与调试进阶
  • 第3章 C++多线程编程从入门到进阶
  • 第4章 C++网络编程重难点解析
  • 第5章 网络通信故障排查常用命令
  • 第6章 网络通信协议设计
  • 第7章 高性能服务结构设计
  • 第8章 Redis网络通信模块源码分析
  • 第9章 服务其他模块设计
  • 🚀 全部章节.pdf 下载 (opens new window)
  • 🔥C++游戏编程入门(零基础学C++)
  • 🔥使用C++17从零开发一个调试器 (opens new window)
  • 🔥使用C++20从零构建一个完整的低延迟交易系统 (opens new window)
  • 🔥使用C++从零写一个C语言编译器 (opens new window)
  • 🔥从零用C语言写一个Redis
  • leveldb源码分析
  • libevent源码分析
  • Memcached源码分析
  • TeamTalk源码分析
  • 优质源码分享 (opens new window)
  • 🔥远程控制软件gh0st源码分析
  • 🔥Windows 10系统编程
  • 🔥Linux 5.x内核开发与调试 完全指南 (opens new window)
  • TCP源码实现超详细注释版.pdf (opens new window)
  • 高效Go并发编程
  • Go性能调优
  • Go项目架构设计
  • 🔥使用Go从零开发一个数据库
  • 🔥使用Go从零开发一个编译器 (opens new window)
  • 🔥使用Go从零开发一个解释器 (opens new window)
Rust编程指南
  • SQL零基础指南
  • MySQL开发与调试指南
GitHub (opens new window)
  • 第1章C++惯用法与ModernC++篇

    • 1.1 C++ RAII惯用法
    • 1.2 pimpl 惯用法
    • 1.3 拥抱C++新变化(C++11/14/17新增的实用特性)
    • 1.4 统一的类成员初始化语法与 std::initializer_list<T>
    • 1.5 C++17注解标签(attributes)
    • 1.6 final/override/=default/=delete语法
    • 1.7 auto关键字的前尘后事
    • 1.8 Range-based 循环语法
    • 1.9 C++17结构化绑定
    • 1.10 stl容器新增的实用方法介绍
    • 1.11 stl中的智能指针类详解
  • 第2章C++开发工具与调试进阶

  • 第3章C++多线程编程从入门到进阶

  • 第4章C++网络编程重难点解析

  • 第5章网络通信故障排查常用命令

  • 第6章网络通信协议设计

  • 第7章高性能服务结构设计

  • 第8章Redis 网络通信模块源码分析

  • 第9章 服务其他模块设计

  • C++后端开发进阶
  • 第1章C++惯用法与ModernC++篇
zhangxf
2023-04-03

1.3 拥抱C++新变化(C++11/14/17新增的实用特性)

C++11标准 是 C++ 语言发展史上具有里程碑意义的一个版本,其核心主要改进了之前的C++ 98/03存在的两大问题:

  • 废弃了C++98/03标准中一些不实用的语法和库(如std::auto_ptr),改进或者增强了C++ 98/03标准中一些语法元素的用法(如auto 关键字、统一类的初始化列表语法),新增了一些其他编程语言早已经支持的关键字和语法(如final关键字、=default语法 、=delete语法);
  • 开始在语法和自带的标准库的层面上增加对操作系统的功能的支持(如线程库、时间库)。之前很多功能的实现,C++语言本身是无法支持的,必须依赖使用原生的操作系统的API函数,导致开发者需要编写大量平台相关的代码。

随着标准的发展,后继的又产生了C++14、C++17以及现在最新的C++20标准,但它们都是对C++11作小范围的修改和扩展,其主要内容还是继续完善一些特性和进一步提高一些标准库的性能。由于C++ 11新增了大量方便开发的功能与特性,支持C++11标准的编译器(如VC++12、g++ 4.8)一经发布,立即被广大开发者和使用C++的企业广泛采用。笔者也在 C++11 发布以后将自己的个人和公司项目全部使用C++11语法重构了一遍,C++11新增的特性确实大大提高了开发效率,使用起来非常舒服。

对于MSVC编译器,支持C++11新标准的最低版本是VC++12(随Visual Studio 2013一起发布,Visual Studio以下简称VS),VS 2015支持部分C++14特性,VS 2017完美支持C++14和部分C++17特性,VS 2019 完美支持C++17大多数语言特性。

对于gcc/g++编译器,支持C++11新标准的最低版本是gcc/g++ 4.8,支持C++14是gcc/g++ 4.9,gcc/g++ 7.3完美支持C++17大多数语言特性。

各个编译器对于C++11/14/17语法特性和标准库支持情况,完整列表可参考https://en.cppreference.com/w/cpp/compiler_support (opens new window)。

对于某个支持C++11/14/17语言的标准的Visual Studio版本,你一般不需要做任何特殊设置即可使用新语言标准支持的语法特性和库功能,当然你也可以通过设置指定具体的语言规范版本,以Visual Studio 2019为例,新建一个C++项目之后,选中该项目,在弹出的右键菜单中选择【Properties】菜单项打开该项目的【属性设置】对话框,如下图所示:

然后选择【C/C++】- 【Language】- 【C++ Language Standard】,在弹出的下拉菜单中选择你需要的C++标准即可:

这里需要说明一下,选项Default在VS 2019中即对应使用C++ 14规范标准,选项Preview - Features from the latest C++ Working Draft(/std:c++ latest)即使用当前最新的C++标准(这里是C++20),当Microsoft完成C++20标准中所有的实现时,这里会多出一个选项,即ISO C++20 Standard(/std:c++20)。

对于gcc/g++编译器(最低版本4.8),如果要使用C++11/14/17语言规范,则需要在编译时设置相应的选项值。例如将test.cpp文件编译成名为test的可执行文件,同时需要C++ 11语言规范支持,则使用:

g++ -g -o test test.cpp -std=c++11
1

在使用Makefile文件编译项目时可以这样指定:

make CXXFLAGS="-g -O0 -std=c++11"
1

在使用cmake编译项目时可以在CMakeLists.txt文件中添加如下行:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -g -Wall -O0 -Wno-unused-variable")
1

-std 选项的值可以按需设置成 c++14 或 c++17。

对于gcc/g++ 7.3及以上版本,由于编译器本身就支持包括C++17在内的所有语言特性,因此如果代码中用到某个特性,由于编译器本身就支持,可以不必使用 -std 选项指定具体的语言标准。

C++11/14/17新增的特性非常多,本章接下来会介绍一些实际开发中高频使用的新语法和新特性。

上次更新: 2025/04/01, 20:53:14
1.2 pimpl 惯用法
1.4 统一的类成员初始化语法与 std::initializer_list<T>

← 1.2 pimpl 惯用法 1.4 统一的类成员初始化语法与 std::initializer_list<T>→

最近更新
01
C++语言面试问题集锦 目录与说明
03-27
02
第四章 Lambda函数
03-27
03
第二章 关键字static及其不同用法
03-27
更多文章>
Copyright © 2024-2025 沪ICP备2023015129号 张小方 版权所有
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式