什么是返回非空指针的正确方法
What is a proper way to return NOT NULL pointer
我在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(正如您在相关中使用的值)而不是任何其他值,因为其他值可以以某种方式解释(这不好)。如果您只想返回一个非零值(非空指针),则最好使用一个无法从中提取任何特殊值的值。
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 运行时错误:引用绑定到类型为"int"的空指针
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 为什么我在空指针错误(链表)中获取成员访问权限
- 从向量到空指针的 memcpy(反之亦然)不起作用
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 成员访问是否在空指针上定义C++?
- 尝试将对象插入空指针数组时出现分段错误
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 是否允许向空指针添加零?
- 为什么 C 样式字符串的工作空指针检查不?
- 在函数内初始化无符号字符指针将返回空指针
- C++ push() 和 pop() 方法使用指针的动态 LinkedList 的问题
- 为什么多维数组中的空字符串文本衰减为空指针?
- 如何在 Python 中的 SWIG Director 方法中处理空指针
- C 标准的哪一部分涵盖通过空指针调用方法
- 为什么通过空指针调用方法在C++中"有效"?
- 我可以在c++方法中返回空指针吗?
- 信号.h 是捕获空指针的可靠方法吗?
- 什么是返回非空指针的正确方法