見出し画像

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で設定することもできる





  • 以下を参考にした


いいなと思ったら応援しよう!