2016-05-31 109 views
-1

我有一个回调函数的数组。一个函数只能在定义“SOMETHING”时使用。它是正确的有#ifdef来一个数组里面,如:在数组中使用#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侵犯:

“数组的初始化器数量比其声明的大小要小,默认 初始化应用于数组元素的其余部分”

+3

的正确尺寸确定真正的代码不会说例如'[5]'而不是'[]'?这将解释错误消息,它提到了数组的“声明大小”,但是你的数组没有声明大小。 – emlai

+0

你当然可以做到这一点。错误是由于别的。 – Haris

+0

@tuple_cat:对不起,我忘了提及数组的大小是用5 – JohnDoe

回答

2

的解决方案是简单,使用和#else NULL指针如果SOMETHING没有定义:

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

而且两者定义和声明应使用恒定大小来定义的同样的方式,:

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

如果数组的大小也依赖于什么,然后定义另一个宏:

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

但如果没有定义SOMETHING,我必须使用数组中提到的其他函数回调,或者我误解了某些东西? – JohnDoe

+3

@ milexy86你在说什么世界?如果未定义'SOMETHING',则需要提供缺少的初始化程序。数组不会缩小,因为你的声明迫使它有5个元素。你有两种选择:(1)用'NULL'填充或(2)使数组自我调整大小,以便只有4个元素,如果没有定义'SOMETHING'。做出您的选择,然后修复您的错误。 –

+0

@TomKarzes:你说得对,我自己曲解了一些东西。 (2)的解决方案将被使用,它的工作原理。谢谢! – JohnDoe

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; 

所以,就这个样子我有阵列

+0

您可以只定义一个简单的定义,其值更改取决于是否定义了SOMETHING。这样你就不必担心统计员。看到我的答案:http://stackoverflow.com/a/37541921/4082723 – 2501