【问题标题】:C Compile-Time assert on const array of function pointers函数指针的 const 数组上的 C 编译时断言
【发布时间】:2018-04-25 10:03:46
【问题描述】:

我有这个 const 函数指针数组:

const callback_t callbacks[] =
{
    func1,
    func2,
    func3,
    func4,
    func5
};

我想添加 C 编译时断言以确保 func1 放在数组中的第一个位置。 类似的东西:

C_ASSERT(callbacks[0] == func1);

在 pre-preocessor 阶段之后,这被扩展为:

extern char __C_ASSERT__272[( callbacks[0] == func1)?1:-1] __attribute__((unused))

但我收到编译错误:

error: variably modified '__C_ASSERT__272' at file scope

【问题讨论】:

  • 那么C_ASSERT是什么?标准 C 中没有这样的宏(我认为是的)。
  • 为什么你需要一个断言?您已经声明了数组const,所以除了func1 之外什么都不会出现在那个位置上。如果您担心有人会不兼容地更改代码,那么这就是您的单元测试的工作(并且好的 cmets 可以解释 为什么 callbacks[0] 必须是 func1)。
  • 我已将 C_ASSERT 的扩展添加到问题中。我需要它以防止(由其他人)错误地更改。问题中的示例自然比真实代码要最小化。
  • 我正在投票重新开放。选择的副本不准确:_Static_assert 也不会编译。

标签: c constants function-pointers assert


【解决方案1】:

你不能。变量的值(在这种情况下为callbacks[0])不能在 C 中的常量表达式中使用。即使声明了变量 const,也不能。

您必须执行运行时断言或检查,或者在数组定义旁边添加大注释,说 /* func1 must be first! */

【讨论】:

    猜你喜欢
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多