在数组中使用#ifdef?

时间:2016-05-31 09:20:19

标签: c arrays conditional-compilation misra

我有一系列回调函数。只有在定义“SOMETHING”时才能使用一个功能。在数组中包含#ifdef是否正确,如:

void (*const array[])(void) =
{
    function_callback1,
    function_callback2,
    function_callback3,
    function_callback4,

    #if defined ( SOMETHING)
    function_callback5
    #endif
};

数组在头文件中定义为:

extern void (*const array[5])(void);

我违反了MISRA:

  

“数组初始值设定项少于声明的大小。默认值   初始化应用于数组元素的其余部分“

2 个答案:

答案 0 :(得分:2)

解决方案很简单,如果未定义#else,请使用SOMETHING和NULL指针:

#if defined ( SOMETHING)
function_callback5
#else
NULL
#endif

定义和声明都应该以相同的方式定义,使用大小常量:

void (*const array[5])(void) = {...
extern void (*const array[5])(void);

如果数组的大小也取决于SOMETHING,则定义另一个宏:

#ifdef SOMETHING
    #define ARRAY_SIZE 5
#else 
    #define ARRAY_SIZE 4
#endif

答案 1 :(得分:0)

感谢@TomKarzes和@tuple_cat。 这都怪我。我通过阅读代码(由其他人编写)快速阅读并且没有注意头文件。

因此声明的数组的大小是真实的:

array extern void (*const array[AMOUNT_OF_CALLBACK_FUNCTIONS])(void)

其中:

 typedef enum
 {
    FUNCTION1 = 0,
    FUNCTION2,
    FUNCTION3,
    FUNCTION4,
    #if defined ( SOMETHING)
    FUNCTION5,
    #endif
    AMOUNT_OF_CALLBACK_FUNCTIONS
  }enum_t;

所以,通过这种方式,我有正确的数组大小