構造体の宣言について

以下のコードは、g++ ではコンパイル可能だが、gcc ではコンパイルできない。

これは、構造体名とエイリアスでは、エイリアス側が正であるため。

typedef struct structa
{
    int b;
} tstructa;

void samplefunc()
{
    structa structa;
}

拡張子が .c で上記コードが存在する場合は以下の対応が必要。

  1. コンパイラを g++ にする
  2. IntelliSense を c++ にする

1 コンパイラを g++ にする

makefile にて makesrc.mk を include する前に以下を記載する。

CC=g++

2 IntelliSense を c++ にする

ワークスペースの settings.json に以下記載する。

"files.associations": {
    "*.c": "cpp"
}

特定フォルダに適用したい場合

** はサブディレクトリも含めて .c ファイルを検索するワイルドカード。

files.associations の設定は絶対パスのパターンマッチであり、${workspaceFolder} が利用できない。そのため、先頭に **/ を付与する必要がある。(see issue)

以下により、samplesubdir 配下の *.c を c++ として解釈できる。

"files.associations": {
    "**/test/src/samplesubdir/**/*.c": "cpp"
}