【问题标题】:"invalid use of void expression"“无效使用无效表达式”
【发布时间】:2012-03-15 14:03:51
【问题描述】:

我需要编写一个在 bitarray 上运行的宏,如下所示:

   array[0] = number of bits in bitarray (integer) 
   array[1..n] = bits

宏必须如下所示:

GetBit(pointer, index)
Macro *must* return 0,1 or call function similar to exit().

这是我应该编写的(工作)内联函数版本的宏:

static inline unsigned long GetBit(BitArray_t array, unsigned long index)
{
        if ((index) >= array[0])
                        exit(EXIT_FAILURE);
        else
                return (GetBit_wo_boundary_checks(array,index));
}

这就是我所拥有的:

#define GetBit(array,index)\
                (((index) < array[0] || exit(EXIT_FAILURE)) ?\
                        GetBit_wo_boundary_checks(array,index) : 0)

我的问题是,这个必须在尝试使用 GetBit_wo_boundary_checks(p,i) 访问未定义的内存之前进行索引边界检查 (i

我认为我可以通过将出口置于短路评估条件来解决此问题,但我得到:“无效使用 void 表达式”

当索引高于数组[0]中定义的最大值时,有什么方法可以让这个表达式宏透明地退出()?

【问题讨论】:

    标签: c c-preprocessor


    【解决方案1】:

    一种选择是在您的exit() 调用中使用逗号运算符,例如:

    (exit(EXIT_FAILURE), 0)
    

    这有点hack-ish,但这将使表达式返回值0,并且应该满足编译器的要求。

    【讨论】:

    • 我可以发誓我之前尝试过但没有成功,但这次编译器没有抱怨。谢谢。
    【解决方案2】:

    您可以使用, 运算符来执行此操作:

    #define GetBit(array,index) \
                (((index) >= array[0]) \
                 ? exit(EXIT_FAILURE), -1 \
                 : GetBit_wo_boundary_checks(array,(index)))
    

    请注意,index 被评估了两次,这是不安全的。

    【讨论】:

      【解决方案3】:

      您是否尝试将您的exit(EXIT_FAILURE) 替换为(exit(EXIT_FAILURE), 1)?虽然这只是一个猜测,但这应该可以解决问题。该表达式现在产生一个值(逗号运算符的右操作数——在本例中为 1),但首先强制评估对 exit 的调用,这是您真正关心的部分。

      【讨论】:

        【解决方案4】:

        也许你可以声明一个“类似于exit”的函数,它调用exit并返回一个值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多