2016-05-31 103 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