I'd like to check static initalizers at compile time. I'm implementing the macro CASSERT() from this question.
Now, I have this "strange" situation
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;
And I have a structure initialized like this:
const t_EQADC_Pin_Config EQADC_xPinConfig[EQADC_CHAN_MAX] = {
{ 123 }, /* EQADC_CHAN_A_00 */
{ 321 }, /* EQADC_CHAN_A_01 */
... /* Others */
};
What is strange (to me...) is that the following statement
CASSERT(( sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0]) ) != 62 );
works fine, and actually "passes" (i.e. compiles without errors). Instead, this:
CASSERT(( sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0]) ) != EQADC_CHAN_MAX );
does not (i.e. it actually generates an assertion, and stops the compiler.
Trying to figure out why this happens, I think that the problem is related to the value of EQADC_CHAN_MAX, that is not known at compile time, being an enum value. If this is the case, I still can't understand why this declaration
const t_EQADC_Pin_Config EQADC_xPinConfig[EQADC_CHAN_MAX]
actually instantiates the correct size for the array... Any help on how I can (better) implement this is really appreciated.
Edit: my fault. The correct syntax is
CASSERT(( sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0]) ) == EQADC_CHAN_MAX );
Furthermore, pay attention as declaring the array this way:
const t_EQADC_Pin_Config EQADC_xPinConfig[EQADC_CHAN_MAX] = { Initializers ....}
actually allocates the size of EQADC_CHAN_MAX elements, even if the number of initialized elements is not actually correct. So, the right way to implement this is:
const t_EQADC_Pin_Config EQADC_xPinConfig[] = { Initializers ....}
CASSERT(( sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0]) ) == EQADC_CHAN_MAX );
Thank you all.