ESP32 之 ESP-IDF 教学(五(2))——使用C++的工程

时间:2025-01-15 07:19:28

本文章 来自原创专栏《ESP32教学专栏 (基于ESP-IDF)》,讲解如何使用 ESP-IDF 构建 ESP32 程序,发布文章并会持续为已发布文章添加新内容! 每篇文章都经过了精打细磨!

↓↓↓通过下方对话框进入专栏目录页↓↓↓
**** 请求进入目录 _ O x

是否进入ESP32教学导航(基于ESP-IDF)?

 确定


文章目录

    • 1、导言
    • 2、在main文件中使用C++ —— 将 `/main/`更改为`/main/`
    • 3、在组件(`Components`)中使用C++

1、导言

在上一篇文章ESP32 之 ESP-IDF 学习笔记(五)【ESP-IDF CMake构建系统(Build System)】中讲到了 ESP-IDF 的 CMake 工程结构,并重点讲了如何利用 组件Components编译器找到你的各种程序文件(*.c *.cpp)以及头文件(*.h),以构建完整的工程。

乐鑫提供的官方工具链支持C++的编译,所以ESP-IDF工程是支持C++的。

C++在嵌入式领域的优点颇多,下面介绍在ESP-IDF工程中使用C++以及使用过程中的注意事项。

2、在main文件中使用C++ —— 将 /main/更改为/main/

我们知道,一个标准ESP-IDF工程文件夹中有一个main文件夹,这个文件夹就是main组件。具体详见上一篇文章:ESP32 之 ESP-IDF 学习笔记(五)【ESP-IDF CMake构建系统(Build System)】

大多数例程中都至少有,而这个的内容一般是:

idf_component_register(	
		SRCS 			""
		INCLUDE_DIRS 	"." 
)
  • 1
  • 2
  • 3
  • 4

注意第二行,就是需要编译的源文件。下面我们把它改为同时把main文件夹下的改名为。这样就是把main组件用C++编写的第一步。

idf_component_register(	
		SRCS 			""
		INCLUDE_DIRS 	"." 
)
  • 1
  • 2
  • 3
  • 4

第二步,我们打开改名后的文件,里边的内容一般有一个app_main()入口函数。如:

#include <>

void app_main() {

}
  • 1
  • 2
  • 3
  • 4
  • 5

我们把改名为后,还需要把app_main()函数前边加上如下内容,使其变成如下代码。当然,头文件也可以换成cpp的标准输入输出头文件

#include <iostream>

extern "C" void app_main() {

}
  • 1
  • 2
  • 3
  • 4
  • 5

这是因为C++编译器与C编译器的原因,我们知道C语言是不支持函数重载的,同名函数只能有一个,而在C++中,同名函数但不同参数的函数是可以存在的,并且在使用过程中互不干扰,原因是编译之后的函数不同。

注意:并不是 所有函数在使用C++编译时都要加extern "C",原因见下


打个比方(以下 可能并不是真实的情况,只是打一种比方

void func(int para1, int para2);

void func(int para1, float para2);
  • 1
  • 2
  • 3

在C++中编译后你可以理解为(以下 可能并不是真实的情况,只是打一种比方)通过这样实现的函数重载

void func_int_int(int para1, int para2);

void func_int_float(int para1, float para2);
  • 1
  • 2
  • 3

而在C语言编译后你就可以理解成函数名不变,我们的入口函数app_main()函数也是如此。因此,因为函数重载的原因,程序执行时 ESP32 可能找不到你的入口函数。所以要让ESP32找到入口函数,必须告诉编译器,此函数不能按照C++那样进行编译。所以就有了函数头部的extern "C"

注意:extern "C"还有其他的用法,这不是本文的重点,请读者自行查询。

3、在组件(Components)中使用C++

参考本文第2小节介绍的 main组件(在main文件中使用C++ )

ESP-IDF提供了关于C++使用的例程,参照esp-idf\examples\cxx\