0
点赞
收藏
分享

微信扫一扫

[单片机框架][esp32] 使用C++17新特性报错


  1. 修改CMakeLists.txt ,追加-std=gnu++17

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

  1. 修改cmake编译文件,路径x:\Espressif\esp-idf\tools\cmake\build.cmake

    c++17新特性有:
    1、对auto表达式推导的规则进行了改变;
    2、lambda表达式可以捕获“*this”;
    3、新增inline变量,可以直接将全局变量定义在头文件中;
    4、条件表达式中支持初始化语句;
    5、枚举的直接列表初始化等等。

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>

  1. lambda表达式

lambda也是c++11中引入的,在C++11中,lambda表达式只能用捕获this,this是当前对象的一个只读的引用。 在C++17中,可以捕获*this, *this是当前对象的一个拷贝,捕获当前对象的拷贝,能够确保当前对象释放后, lambda表达式能安全的调用this中的变量和方法。

  1. inline变量

Inline 变量, inline变量可以让变量有多于一次的定义。C++17之前,我们定义全局变量, 总需要将变量定义在cpp文件中,然后在通过extern关键字来告诉编译器 这个变量已经在其他地方定义过了。 inline变量出现后,我们可以直接将全局变量定义在头文件中,而不用担心出现redefine的错误信息。

  1. 条件表达式中支持初始化语句

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;
}

C++17还增加了一些其他特性:

  1. bool 表达式不能用 ++, – 这两个自增(减)运算符了
  2. c++17中异常已经成为了类型系统的一部分,
  3. 枚举的直接列表初始化
  4. 结构化绑定
  5. constexpr if 表达式
  6. map支持merge和extract


举报

相关推荐

0 条评论