2010-12-01 8 views
1

コンパイル時に静的な初期化子をチェックしたいと思います。私はthis questionからマクロCASSERT()を実装しています。コンパイル時に列挙型の値を確認する

さて、私はこの「奇妙な」状況

typedef enum 
{ 
    EQADC_CHAN_A_00 = 0, 
    EQADC_CHAN_A_01, 
    EQADC_CHAN_A_02, 
    EQADC_CHAN_A_03, 
    EQADC_CHAN_A_04, 
    ...     // Others 
    EQADC_CHAN_MAX  // EQADC_CHAN_MAX = 62 

} eQadc_tInputBiosId; 

を持っていると私はこのように初期化構造を有する:

const t_EQADC_Pin_Config EQADC_xPinConfig[EQADC_CHAN_MAX] = { 
    { 123 }, /* EQADC_CHAN_A_00 */ 
    { 321 }, /* EQADC_CHAN_A_01 */ 
    ...  /* Others */ 
}; 

(...私には)奇妙である何が、次のことですステートメント

CASSERT((sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0])) != 62); 

実際には "合格"(つまりエラーなしでコンパイル)です。 は代わりに、この:。

CASSERT((sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0])) != EQADC_CHAN_MAX); 

は(すなわち、それは実際にアサーションを生成し、コンパイラを停止しません

これがなぜ起こるか理解しようと、私はこの問題は、の値に関連していることだと思いますそれは列挙値で、コンパイル時に知られていない。このような場合は、この宣言

const t_EQADC_Pin_Config EQADC_xPinConfig[EQADC_CHAN_MAX] 

は、実際には配列のための正しいサイズをインスタンス化する理由を、私はまだ理解できない... どれをEQADC_CHAN_MAX、 hどのように私は(より良い)これを実装することができますにelpは本当に感謝しています。

:私のせいです。

const t_EQADC_Pin_Config EQADC_xPinConfig[EQADC_CHAN_MAX] = { Initializers ....} 

実際初期化要素の数は、実際に正しくない場合でも、EQADC_CHAN_MAX要素のサイズを割り当て:正しい構文は

CASSERT((sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0])) == EQADC_CHAN_MAX); 

さらに、配列をこのように宣言するよう注意を払っています。 ので、これを実装するための正しい方法は次のとおりです。

const t_EQADC_Pin_Config EQADC_xPinConfig[] = { Initializers ....} 
CASSERT((sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0])) == EQADC_CHAN_MAX); 

はあなたのすべてをありがとうございました。

+0

あなたはどんな主張をしていますか? – AlastairG

+0

CASSERTはどうやって定義していますか? –

答えて

2

this threadをご覧ください。

これで問題が解決しない場合は、-pオプションを使用してコンパイルのステップを実行したり、コンパイラのためにプリプロセッサの出力を生成したりできますか?それは、第2のアサーションの述語があなたが期待するものに評価されない理由を明確にするかもしれません。

また、配列のサイズがではないと主張しているのはなぜですか? 62ですか?

0

あなたは肯定的ですかEQADC_CHAN_MAX == 62?あなたはprintf("%d", EQADC_CHAN_MAX)を入れて確認できますか?

+0

CASSERT()マクロが間違った方法で定義されていると思いますか? – AlastairG

関連する問題