よくある質問(FAQ)

構造体/共用体メンバにアクセスする行で解析エラーが発生しました。

解析エラーの回避策について

質問

構造体/共用体メンバにアクセスする行で解析エラーが発生しました。回避策を教えてください。
言語設定は「ANSI-C」に設定しています。

■記述例

typedef union {
 struct {
  unsigned char aaa;
  unsigned short bbb;
  unsigned long ccc;
 }; // ★無名(名前なし)
 unsigned char BYTE[20];
} UTable;

int test(int a)
{
 UTable table;

 if (a < 0) {
  return -1;
 }

 table.aaa = 1; // ★エラー発生
 return a;
}

■解析エラー
Cソースの詳細解析中...
 C:¥XXXXXXXX¥YYYYYYYY¥test.c
CasePlayer2-E-SYN : 名前( aaa )が宣言されていません.
 C:¥XXXXXXXX¥YYYYYYYY¥test.c(18)
CasePlayer2-I-COMP : エラー:1 警告:0
仕様書生成エラー終了.

回答

構造体/共用体内に「無名構造体」「無名共用体」型のメンバが存在するため、エラーが発生しています。無名の構造体 (及び共用体) は、ANSI-C 仕様に違反 しています。無名の構造体 (及び共用体) は GNU-Cで規定されている仕様です。

■回避策
「言語設定」を、ANSI-Cから GNU-Cへ変更することでエラーを回避できます。

何等かの事情で「言語設定」を変更できない (ANSI-C で使用したい) 場合は、下記のようにソースコードを変更する必要があります。

■修正 例
typedef union {
 struct {
  unsigned char aaa;
  unsigned short bbb;
  unsigned long ccc;
 } ST;  // 構造体名を明示(名前は任意です)
 unsigned char BYTE[20];
} UTable;

int test(int a)
{
 UTable table;

 if (a < 0) {
  return -1;
 }

 table.ST.aaa = 1;  // 構造体名を追加
 return a;
}