7

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

那么,告诉它一切都很好的最好方法是什么?

我用:

return reinterpret_cast<void*>(1);

但它看起来很丑...

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

static int success;
return &success;
4

5 回答 5

11
static int dummy;
return &dummy;

严格来说,static这可能不是必需的,但是返回一个指向超出范围的本地的指针感觉有点粗俗。

编辑:注意@sharptooth 的评论。严格来说,static 必须的。

于 2013-01-23T10:52:40.523 回答
4

使用reinterpret_cast尽可能干净。问题是从文字中制作此类指针会int产生未定义的行为——标准禁止使用非空指针且未指向正确分配的对象。符合标准的方法是拥有一些变量(也许文件范围变量是最方便的)并返回其地址。

于 2013-01-23T10:50:56.877 回答
3

我可能会写这样的东西:

return const_cast<void*>(""); // non-null pointer, referand doesn't matter

也许回调函数有一个指针输入保证不为空。如果是这样,那么您可以将其退回。

reinterpret_cast<void*>(1)应该看起来很难看,因为它不能保证工作。大多数架构不介意你这样做,但是

  • 该标准实际上并不能保证您可以使用不是任何对象地址的指针值(或空指针,或数组的末端)。
  • 该标准不保证它reinterpret_cast<void*>(1)不是空指针,它是实现定义的。

我怀疑是否真的存在您的函数意外返回 null 的实现,但这是允许的。想象一个假设的实现,其中 CPU 自己的寻址是 4 位而不是 8 位。当然,实现者仍然会选择CHAR_BIT == 8,并且 C++ 中的所有指针都是 8 位对齐的。然后,通过保持位模式不变,实现可以合法且相当合理地从指针映射到整数,并通过将最后一位归零来从整数映射到指针。或者,它可以右移和左移 1 位。该标准要求指针 -> 整数 -> 指针恢复原始值,但不要求整数 -> 指针 -> 整数这样做。

于 2013-01-23T11:15:43.913 回答
2

怎么样

return this;

作为返回保证为非NULL的有效指针的简单方法?

于 2013-01-23T10:51:00.877 回答
1

如果是我,我会使用:

return (void*)1;

简单而美丽。

我更喜欢值 1(正如您在问题中使用的那样)而不是任何其他值,因为其他值可以以某种方式解释(这不好)。如果您只想返回一个非零值(非空指针),那么最好使用一个不能从中提取任何特殊内容的值。

于 2013-01-23T11:13:14.897 回答