本文章 来自原创专栏《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\