Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回非空指针的正确方法是什么_C++_Pointers - Fatal编程技术网

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

C++ 返回非空指针的正确方法是什么,c++,pointers,C++,Pointers,我在C++程序中使用外部C库,库使用回调函数,它必须返回 Value*/Cuff>。库检查返回值是否不为NULL,这意味着成功 那么,告诉它一切都好的最好方式是什么呢 我使用: return reinterpret_cast<void*>(1); 使用reinterpret\u cast尽可能干净。问题是从intliterals手工制作这样的指针会产生未定义的行为-标准禁止使用非空指针和未指向正确分配的对象的指针。标准的兼容方式是使用一些变量(也许文件范围变量是最方便的)并返回其地

我在C++程序中使用外部C库,库使用回调函数,它必须返回<代码> Value*/Cuff>。库检查返回值是否不为NULL,这意味着成功

那么,告诉它一切都好的最好方式是什么呢

我使用:

return reinterpret_cast<void*>(1);

使用
reinterpret\u cast
尽可能干净。问题是从
int
literals手工制作这样的指针会产生未定义的行为-标准禁止使用非空指针和未指向正确分配的对象的指针。标准的兼容方式是使用一些变量(也许文件范围变量是最方便的)并返回其地址。

怎么样

return this;
作为返回保证为非空的有效指针的简单方法

static int dummy;
return &dummy;
严格来说,
static
可能不是必需的,但是返回指向超出范围的本地的指针感觉有点笨拙


编辑:注意@sharptooth的评论。严格来说,
静态
是必需的。

如果是我,我会使用:

return (void*)1;
简单而美丽


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

我可能会这样写:

return const_cast<void*>(""); // non-null pointer, referand doesn't matter
返回常量强制转换(“”;//非空指针,无所谓
可能回调函数的指针输入保证不为null。如果是这样的话,你可以把它还给我

reinterpret\u cast(1)
看起来很难看,因为它不能保证工作。大多数架构并不介意您这样做,但是

  • 该标准实际上并不保证可以使用不是任何对象地址的指针值(或空指针,或数组末尾的指针)
  • 该标准不保证
    reinterpret\u cast(1)
    不是空指针,这是实现定义的


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

返回值有任何(其他)语义吗?我很好奇。图书馆是什么?什么很丑?很漂亮。它有pair和()对。还有单词return和reinterpret,它重复了我最喜欢的字母R。你还想要什么?@GrahamBorland它是Mongoose Web服务器,有时它使用返回的指针,但在简单的情况下,只需检查它是否为NULL。如果你确定它没有被使用,如果函数是独立函数而不是成员函数,那么你的方法也是可行的。@JoachimPileborg我认为不允许从函数指针转换为数据指针?@R.MartinhoFernandes我相信你是对的,但是如果OP想要的只是一个有效的指针,那就没关系了。这完全取决于库使用指针的目的。遗憾的是,它不是类成员@JoachimPileborg,漂亮的解决方案,但也需要重新解释转换)如果没有
static
,您将得到一个悬空的指针,并且使用(甚至复制)这样的指针是UB。@Sharptoth:我原以为复制指针会很好,只要它构造正确(即,在某个点上是有效的)。请注意,我并不反对,只是感到惊讶。是的,这是一个常见的误解,它只适用于大多数架构,但它是UB。@Marcelocontos:
static void*success=reinterpret_cast(&success)
允许
返回成功之后:数据不正确
reinterpret_cast(1)
是定义良好的代码,用于根据指针和整数之间的实现定义映射创建实现定义的指针值。(参见C++标准条款[ Exp.Real译,Case]),5:@巴特·范根-舍诺:非常好,但是如果它得到了一个无效的指针,你就得到UB。@ BaltvnEngEnShaneAu:如果没有别的,UB是调用方要将指针值与空指针进行比较。我不确定返回无效指针值是否算作“使用”它([basic.stc.dynamic.deallocation]/4),但将其与null进行比较就可以了。我也不清楚
void*
int
之间的实现定义的映射是否需要包含对应于
int
的每个值的指针值,或者是否允许实现定义
1
根本没有值,而强制转换本身将陷入陷阱或其他任何情况。@SteveJessop:我的问题是实现定义(从C++11开始)重新解释强制转换(1)
的结果是否会导致无效的指针值。据我所知,在C++11之前,这是没有指定的(我假设,这是整数和指针之间映射的一部分)。@BartvanIngenSchenau:IIRC C标准至少定义了什么是有效指针(
(void*)1
,未列出)。我想知道为什么它不被粘贴到C++标准中,如果它是你所声称的(我没有时间检查它)。试着:错误:无效的转换从“const Voo* *”到“Value*` @ USER 86215:OOPS。你可以继续投。不过,您所需要的只是一个对象,只要
return const_cast<void*>(""); // non-null pointer, referand doesn't matter