よくある質問(FAQ)

構造体のサイズチェックを行っているマクロ(Static Assert)の使用個所で解析エラーが発生しました。

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

質問

構造体のサイズチェック(Static Assert)を行っているマクロの使用個所で解析エラーが発生しました。 回避策を教えてください。

■記述例
#define ASSERT_CONCAT_(a, b) a##b
#define ASSERT_CONCAT(a, b) ASSERT_CONCAT_(a, b)
#define STATIC_ASSERT(e) enum { ASSERT_CONCAT(ASSERT_LINE_, __LINE__) = 1/(!!(e)) }

// 構造体サイズは5バイト
// ※CasePlayer2で解析したときのサイズは8バイト
struct _tag {
 char  a;  // size=1
 int  b;  // size=4
};

// 構造体サイズ (5バイト) をチェック
STATIC_ASSERT(sizeof(struct _tag)==5);  //★エラー発生

■解析エラー
CasePlayer2-E-SYN : 定数式に中に0除算があります.
 C:\XXXXXXXX\YYYYYYYY\ソースファイル名.c(行番号)

回答

使用コンパイラとCasePlayer2の変数アライメント (境界調整値) が異なることが原因です。CasePlayer2では「構造体メンバ: char a」と「構造体メンバ: int b」の間に4バイトの境界調整が入るため 構造体(全体)のサイズが 8バイトになります。

■回避策
CasePlayer2で解析を行うときは「STATIC_ASSERT」マクロが作用しないように 修正を行う必要があります。

#ifndef CP2
 #define STATIC_ASSERT(e) enum { ASSERT_CONCAT(ASSERT_LINE_, __LINE__) = 1/(!!(e)) }
#else
 #define STATIC_ASSERT(e)
#endif

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