【问题标题】:Using #ifdef inside an array?在数组中使用#ifdef?
【发布时间】: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


【解决方案1】:

解决方案很简单,如果没有定义SOMETHING,则使用#else 和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

【讨论】:

  • 但是如果没有定义 SOMETHING 我必须使用数组中提到的其他函数回调,或者我误解了什么?
  • @milexy86 你到底在说什么?如果未定义 SOMETHING,则需要提供缺少的初始化程序。数组不会缩小,因为您的声明强制它具有 5 个元素。您有两个选择:(1) 使用 NULL 填充或 (2) 使数组自行调整大小,因此如果未定义 SOMETHING,则它只有 4 个元素。做出选择,然后修复错误。
  • @TomKarzes:你说得对,我自己误解了一些东西。将使用(2)的解决方案并且它有效。谢谢!
【解决方案2】:

感谢@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;

所以,这样我就有了正确的数组大小

【讨论】:

  • 你可以有一个简单的定义,它的值改变取决于是否定义了一些东西。这样您就不必为枚举数而烦恼。看我的回答:stackoverflow.com/a/37541921/4082723
猜你喜欢
  • 2013-07-14
  • 1970-01-01
  • 2022-06-29
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
相关资源
最近更新 更多