什么是返回非空指针的正确方法

What is a proper way to return NOT NULL pointer

本文关键字:方法 空指针 返回 什么      更新时间:2023-10-16

我在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中制作此类指针会产生未定义的行为 - 标准禁止使用非 null 且不指向正确分配对象的指针。符合标准的方法是使用一些变量(也许文件范围变量是最方便的)并返回其地址。

我可能会写这样的东西:

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(正如您在相关中使用的值)而不是任何其他值,因为其他值可以以某种方式解释(这不好)。如果您只想返回一个非零值(非空指针),则最好使用一个无法从中提取任何特殊值的值。