我在C ++程序中使用外部C库,库使用回调函数,必须返回void*
。该库检查返回值是否为NULL,这意味着成功。
那么告诉它一切正常的最好方法是什么?
我用:
return reinterpret_cast<void*>(1);
但它看起来很难看......
编辑:感谢您的回复,我会留下来:
static int success;
return &success;
答案 0 :(得分:11)
static int dummy;
return &dummy;
严格地说,static
可能不是必需的,但是返回指向超出范围的本地的指针感觉有点不自在。
编辑:请注意@ sharptooth的评论。严格来说,static
是必需的。
答案 1 :(得分:4)
使用reinterpret_cast
尽可能干净。问题是从int
文字制作这样的指针产生未定义的行为 - 标准禁止使用非空指针并且不指向正确分配的对象。符合标准的方法是使用一些变量(可能是文件范围变量最方便)并返回其地址。
答案 2 :(得分:3)
我可能会写一些类似的东西:
return const_cast<void*>(""); // non-null pointer, referand doesn't matter
也许回调函数的指针输入保证不为null。如果是这样,那么你可以归还。
reinterpret_cast<void*>(1)
假设看起来很难看,因为它无法保证正常工作。大多数架构都不介意你这样做,但
reinterpret_cast<void*>(1)
不是空指针,而是实现定义的。我怀疑确实有一个实现,你的函数偶然返回null,但是允许。想象一个假设的实现,其中CPU自己的寻址是4位而不是8位。当然,实现者仍然会选择CHAR_BIT == 8
,而C ++中的所有指针都是8位对齐的。然后,通过使位模式保持不变,实现可以合法且合理地从指针映射到整数,并且通过将最后一位置零来从整数到指针。或者它可以右移和左移1位。该标准要求指针 - &gt;整数 - &gt;指针恢复原始值,但不需要整数 - &gt;指针 - &gt;整数。
答案 3 :(得分:2)
怎么样
return this;
作为返回保证为非NULL的有效指针的简单方法吗?
答案 4 :(得分:1)
如果是我,我会使用:
return (void*)1;
简单而美丽。
我比任何其他值更喜欢值1(正如您所使用的那样),因为其他值可以某种方式解释(这不好)。如果你想要的只是返回一个非零值(非空指针),最好使用一个不能从中提取任何特殊值的值。