Espressif IDFでC++を使う方法
以下のコマンドなどで、プロジェクトを作る
idf.py create-project my_app
以下のようなC言語用のファイルが生成される
folder
│ CMakeLists.txt
│
└─main
CMakeLists.txt <= *2
my_app.c <= *1
VS Code Extension を使っている場合は、New Project Wizardを使って、プロジェクトを作成することができる
my_app.c から my_app.cpp にリネーム(*1)
my_app.c があるフォルダの中にある、CMakeList.txt の my_app.c を my_app.cpp に書き替える(*2)
VS Codeで開発していれば自動でリネームされることがある
idf_component_register(SRCS "my_app.cpp"
INCLUDE_DIRS ".")
app_main()関数にextern "C"を付与
app_main()をC言語形式のシンボルにして、他のオブジェクトから呼び出しができるようにする
書き替え前
#include <stdio.h>
void app_main(void)
{
printf("OK");
}
書き替え後
#include <stdio.h>
extern "C" void app_main(void)
{
printf("OK");
}
これだけで、C++向けにビルドできる
できれば、CMakeの仕組みも把握したいが、まだ勉強中
以下のコードでは、「C++で追加された機能の参照渡し」を使っている(C++が機能していることを確認するために)
関数で値を変更した結果が反映され「0 1 1」と表示される
#include <stdio.h>
void cpp_func(int& v)
{
printf("%d ", v);
v += 1;
printf("%d ", v);
}
extern "C" void app_main(void)
{
int v = 0;
cpp_func(v);
printf("%d ", v);
}
例外処理を使えるようにする
デフォルトでは、C++の例外処理が無効になっている
例外を導入するデメリットもあるので、無効になっているというのが筆者の見解
パフォーマンス上、不利になる
コードを読む人に依存するが、コードの可読性が下がる可能性がある
(発生する例外を管理をしないと、どの例外を補足すべきかわからなくなる、など)
以下のコマンドを実行して、menuconfig 画面で例外を有効にする
idf.py menuconfig
VS code Extensionを使っている場合は、SDK Configraton editorで設定することもできる
以下を参考にした