我有一系列回调函数。只有在定义“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:
“数组初始值设定项少于声明的大小。默认值 初始化应用于数组元素的其余部分“
答案 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;
所以,通过这种方式,我有正确的数组大小