我是靠谱客的博主 迅速项链,最近开发中收集的这篇文章主要介绍[单片机框架][esp32] 使用C++17新特性报错,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 一、简介
    • (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还增加了一些其他特性:

  1. bool 表达式不能用 ++, – 这两个自增(减)运算符了
  2. c++17中异常已经成为了类型系统的一部分,
  3. 枚举的直接列表初始化
  4. 结构化绑定
  5. constexpr if 表达式
  6. 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新特性报错所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部