我需要编写一个在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()?
答案 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并返回一个值。