概述
文章目录
- 一、简介
- (1)c++17新特性
- (2)C++17中的新特性详解
- 1. auto关键字
- 2. lambda表达式
- 3. inline变量
- 4. 条件表达式中支持初始化语句
- (3)C++17还增加了一些其他特性:
- 二、解决ESP32无法使用c++17特性
- 1. 修改CMakeLists.txt ,追加-std=gnu++17
- 2. 修改cmake编译文件,路径x:Espressifesp-idftoolscmakebuild.cmake
一、简介
(1)c++17新特性
1、对auto表达式推导的规则进行了改变;
2、lambda表达式可以捕获“*this”;
3、新增inline变量,可以直接将全局变量定义在头文件中;
4、条件表达式中支持初始化语句;
5、枚举的直接列表初始化等等。
(2)C++17中的新特性详解
1. auto关键字
从c++11开始,auto关键字能够通过初始化器推导出变量的类型。在c++14中,auto关键字的能力进一步提升,能够通过return语句推导出函数的返回类型。 使用auto关键字能够提高编码效率,同时能够简化重构流程。但是,C++11中的auto推导,往往结果与预期的不同。
c++11 中为了支持统一初始化,引入了新的统一初始化语法,如下所示。
// c++11
auto x3{ 1, 2 }; // std::initializer_list<int>
auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int>
auto x5{ 3 }; // std::initializer_list<int>
2. lambda表达式
lambda也是c++11中引入的,在C++11中,lambda表达式只能用捕获this,this是当前对象的一个只读的引用。 在C++17中,可以捕获*this, *this是当前对象的一个拷贝,捕获当前对象的拷贝,能够确保当前对象释放后, lambda表达式能安全的调用this中的变量和方法。
3. inline变量
Inline 变量, inline变量可以让变量有多于一次的定义。C++17之前,我们定义全局变量, 总需要将变量定义在cpp文件中,然后在通过extern关键字来告诉编译器 这个变量已经在其他地方定义过了。 inline变量出现后,我们可以直接将全局变量定义在头文件中,而不用担心出现redefine的错误信息。
4. 条件表达式中支持初始化语句
c++17中支持在 if 或者switch 语句中进行初始化, 这个能力的出现能够让代码更加的简洁。
// c++17
map<int, string> c = {{1,"a"}};
if(auto res = c.insert(make_pair(2, "b")); !res.second ) {
cout << "key 1 exist" << endl;
} else {
cout << "insert success, value:" << res.first->second << endl;
}
(3)C++17还增加了一些其他特性:
- bool 表达式不能用 ++, – 这两个自增(减)运算符了
- c++17中异常已经成为了类型系统的一部分,
- 枚举的直接列表初始化
- 结构化绑定
- constexpr if 表达式
- map支持merge和extract
二、解决ESP32无法使用c++17特性
1. 修改CMakeLists.txt ,追加-std=gnu++17
CMakeLists.txt内容如下:
# For more information about build system see
# The following five lines of boilerplate have to be in your project's
# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.5)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-missing-field-initializers -funsigned-char -w -Wfatal-errors -Wno-unused-variable -std=gnu++17")
project(main)
2. 修改cmake编译文件,路径x:Espressifesp-idftoolscmakebuild.cmake
最后
以上就是迅速项链为你收集整理的[单片机框架][esp32] 使用C++17新特性报错的全部内容,希望文章能够帮你解决[单片机框架][esp32] 使用C++17新特性报错所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复