我有一个方法
**int** create_object(Object* parent, char* name, int type, int start_block) {
...
return ptr_to_object;
}
函数ptr_to_object
内部似乎是一个32位但是一旦它离开它,它看起来就像它的64位。
注意:我不能使用c99,我知道intptr_t
是c99的一部分。
你有什么建议?谢谢!
答案 0 :(得分:1)
如果你正在处理指针,要么使用指针返回类型,要么在标准定义的int类型中“隐藏”它以足以支持保持指针。这样的类型可以存在但保证存在(tmk):
C99 7.20.1.4 能够保存对象指针的整数类型
- 醇>
以下类型指定一个带符号的整数类型,其属性是任何有效的void指针都可以转换为此类型,然后转换回指向void的指针,结果将等于原始指针:< / p>
<强>使用intptr_t 强>
以下类型指定一个无符号整数类型,其属性是任何有效的void指针都可以转换为此类型,然后转换回指向void的指针,结果将与原始指针进行比较:
<强> uintptr_t的强>
这些类型是可选的。
关键字有可选。很可能它是在您选择的平台上定义的,但是对于遗留的可移植性,您可能最好还是返回void *
或者向类型化或无效指针声明一个专门的“句柄”并返回它。
与往常一样,我对任何使用C99兼容平台的人完全感兴趣,该平台选择 not 来公开标准中提供的一些可选功能(如此)。如果有人<stdint.h>
没有 intptr_t
和/或uintptr_t
,那我很好奇。如果您使用这样的工具链,请发表评论。
答案 1 :(得分:0)
就像@nos所说,如果你正在处理指针,那么使用指针类型。将它们转换为整数是不可移植的并且容易出错。
如果你不希望调用者知道它是一个指针(无论如何都没有挖掘),那么使用typedef
创建一个“句柄”类型,或者其他东西:
typedef my_ptr* object_handle;
事实上,即使你的“句柄”确实是整数,也要这样做。抽象将允许您稍后更改它,而无需任何调用代码需要修改。