“无效使用void表达式”

时间:2012-03-15 14:03:52

标签: c c-preprocessor

我需要编写一个在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)

我的问题是这个进行索引边界检查(i&lt; p [0])并在尝试使用GetBit_wo_boundary_checks(p,i)访问未定义的内存之前退出。

我认为我可以通过将退出置于短路评估状态来解决这个问题,但我得到:“无效使用void表达式”

当index高于array [0]中定义的最大值时,有没有办法让这个表达式宏透明地exit()?

4 个答案:

答案 0 :(得分:6)

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

(exit(EXIT_FAILURE), 0)

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:2)

您是否尝试将exit(EXIT_FAILURE)替换为(exit(EXIT_FAILURE), 1)?虽然这只是一个猜测,但应该这样做。表达式现在生成一个值(在这种情况下,逗号运算符的右操作数 - 1)但强制首先评估对exit的调用,这是您真正关心的部分。

答案 3 :(得分:1)

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