コンパイル時に静的な初期化子をチェックしたいと思います。私は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);
はあなたのすべてをありがとうございました。
あなたはどんな主張をしていますか? – AlastairG
CASSERTはどうやって定義していますか? –