什么是返回NOT NULL指针的正确方法

时间:2013-01-23 10:49:23

标签: c++ pointers

我在C ++程序中使用外部C库,库使用回调函数,必须返回void*。该库检查返回值是否为NULL,这意味着成功。

那么告诉它一切正常的最好方法是什么?

我用:

return reinterpret_cast<void*>(1);

但它看起来很难看......

编辑:感谢您的回复,我会留下来:

static int success;
return &success;

5 个答案:

答案 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(正如您所使用的那样),因为其他值可以某种方式解释(这不好)。如果你想要的只是返回一个非零值(非空指针),最好使用一个不能从中提取任何特殊值的值。