よくある質問(FAQ)

共用体テーブルの初期化で解析エラーが発生しました。

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

質問

共用体の「複合リテラル」を使用したテーブルの初期化で解析エラーが発生しました。回避策を教えてください。
「言語設定」は「GNU-C」に設定しています。

■記述例
struct _str {
 unsigned char A;
};
union _uni {
 unsigned long U; //先頭の要素ラベル
 struct _str C;   //2番目の要素ラベル
};

const union _uni data = { .C.A = 1 }; //★解析エラー

■解析エラー
CasePlayer2-E-SYN : ここに "." は記述できません.
 C:\XXXXXXXX\YYYYYYYY\ソースファイル名.c(行番号)
CasePlayer2-E-SYN : 初期化に誤りがあります.
 C:\XXXXXXXX\YYYYYYYY\\ソースファイル名.c(行番号)

回答

共用体(union)型の先頭以外のメンバ(要素ラベル)を使って初期化を行うと、解析エラーとなります。

※制限事項について
本エラーは制限事項に該当します。詳細については「Windowsメニュー」⇒「GAIO CasePlayer2」⇒「ヘルプ」を辿り、CasePlayer2マニュアルをご覧ください。

■制限事項掲載位置
ー操作方法
 ー仕様書生成
  ーC仕様書生成
   ーC仕様書生成仕様
    ー拡張言語モードの制限 (※「GCC文法制限」の項目に掲載されています。)
     【掲載内容:共用体型の変数の要素ラベルを使った初期化はサポートしておりません】


■回避策
ソース修正が必要です。先頭の要素ラベル(.U)で初期化を行うことで、エラーを回避できます。

#ifndef CP2
 const union _uni data = { .C.A = 1 };
#else
 const union _uni data = { .U = 1 };
#endif

※ CasePlayer2で解析するときは「const union _uni data = { .U = 1 }」が有効となるようにします。
※"CP2"の定義は、CasePlayer2の「プリプセッサの設定」ダイアログの「#define(デファイン名[=数値])」へ設定してください。