【发布时间】:2016-05-31 09:20:18
【问题描述】:
我有一个回调函数数组。只有在定义了“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:
"数组的初始值设定项少于其声明的大小。默认 初始化应用于数组元素的其余部分"
【问题讨论】:
-
你确定真正的代码没有说例如
[5]而不是[]?这将解释错误消息,其中提到了数组的“声明大小”,但您的数组没有声明的大小。 -
您一定可以做到这一点。错误是由其他原因引起的。
-
@tuple_cat :是的,对不起,我忘了提到数组的大小是用 5 定义的
-
使用条件编译(例如
#ifdef),您只需要问自己两个问题:(1)包含代码是否有意义? (2) 如果排除代码是否有意义?你忘了问问题(2)。如果排除了代码,那么您缺少初始化程序,对吗?这里没有什么神秘之处。在这种情况下,您只需提供一个虚拟值,例如NULL。 -
如果没有定义
SOMETHING,你想发生什么?您希望数组的大小为 4,或者最后一个元素是NULL,还是最后一个元素是其他元素?
标签: c arrays conditional-compilation misra