VSCodeでPlatformIOを使用するとき、ボードでコンパイル分岐させることがあります。
とくにArduinoなどのもはやアーキテクチャすら違うボードではライブラリを同様に扱えるようにしておきたいところです。
分岐を行う場合は #if defined() と #endif で挟んでその間に記述を行います。条件に当てはまらなかったときは、そもそもコンパイル対象になりません。
// 使用例(STM32L4xxである場合は、"This is STM32L4xx"と表示) #if defined(STM32L4xx) Serial.println("This is STM32L4xx"); #endif
キーワードの取得自体はそれほど難しくありませんが、PIOの仕様が分からず少し戸惑ったところもあったので、備忘録として残しておきます。
キーワードの取得方法
キーワードはボードごとに異なり、それぞれ探す必要があります。最も簡単な方法がプロジェクトのルートにある .vscode/c_cpp_properties.json の [configurations][defines] 欄の確認となります。

ファイル内では PLATFORMIO=60103, STM32L432xx, STM32L4xx, ARDUINO=10808, ARDUINO_ARCH_STM32, ARDUINO_NUCLEO_L432KC, BOARD_NAME="NUCLEO_L432KC", HAL_UART_MODULE_ENABLED, USE_FULL_LL_DRIVER, VARIANT_H="variant_NUCLEO_L432KC.h"が定義されています。
=で定義されているものは#if ARDUINO==10808のように記述して条件分岐させます。
ボード上のデバイスによって左右されやすいものは BOARD_NAME="NUCLEO_L432KC" などの定義を行い、あまり左右されない場合は ARDUINO_ARCH_STM32 などのゆるい定義を行うと良いでしょう。
いつ c_cpp_properties.jsonが生成されるのか
PlatformIOは非常によくできているIDEで、パス通しがArduinoの仕様を残しつつVSCodeの使い勝手の良さを実現しています。
この使い勝手の良さは .vscode/ 内の設定によって実現していますが、これは以下の条件のときに生成されます。
- プロジェクトルートに
platformio.iniがあるとき - 1の状態で新しくVSCodeのウィンドウを開いたとき
自動生成されたあとに削除などを行わなければ、platformio.ini を編集するたびに自動更新されます。
仮に設定のリセットを行いたい場合は .vscode/ を削除し、VSCodeを再度開きます。
VSCodeを再度開く場合:ターミナル以外の場所をクリック後に「Ctrl + Shift + c」を同時押してターミナルを開いた上でVSCodeを閉じて
code ./でVSCodeを開き直せます。