我在我的 C++ 程序中使用了一个外部 C 库,并且该库使用了一个回调函数,该函数必须返回void*
. 库检查返回值是否不为 NULL,这意味着成功。
那么,告诉它一切都很好的最好方法是什么?
我用:
return reinterpret_cast<void*>(1);
但它看起来很丑...
编辑:感谢您的回复,我会留下来:
static int success;
return &success;
static int dummy;
return &dummy;
严格来说,static
这可能不是必需的,但是返回一个指向超出范围的本地的指针感觉有点粗俗。
编辑:注意@sharptooth 的评论。严格来说,static
是必须的。
使用reinterpret_cast
尽可能干净。问题是从文字中制作此类指针会int
产生未定义的行为——标准禁止使用非空指针且未指向正确分配的对象。符合标准的方法是拥有一些变量(也许文件范围变量是最方便的)并返回其地址。
我可能会写这样的东西:
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 位。该标准要求指针 -> 整数 -> 指针恢复原始值,但不要求整数 -> 指针 -> 整数这样做。
怎么样
return this;
作为返回保证为非NULL的有效指针的简单方法?
如果是我,我会使用:
return (void*)1;
简单而美丽。
我更喜欢值 1(正如您在问题中使用的那样)而不是任何其他值,因为其他值可以以某种方式解释(这不好)。如果您只想返回一个非零值(非空指针),那么最好使用一个不能从中提取任何特殊内容的值。