我有一个方法
**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 的一部分。
你有什么建议?谢谢!
如果您正在处理指针,请使用指针返回类型,或者将其“隐藏”在标准定义的 int 类型中,使其足够大以支持持有指针。这种类型可以存在但不保证存在(tmk):
C99 7.20.1.4能够保存对象指针的整数类型
以下类型指定了一个有符号整数类型,其属性是任何指向 void 的有效指针都可以转换为此类型,然后转换回指向 void 的指针,结果将与原始指针进行比较:
intptr_t
以下类型指定了一个无符号整数类型,其属性是任何指向 void 的有效指针都可以转换为此类型,然后转换回指向 void 的指针,结果将与原始指针进行比较:
uintptr_t
这些类型是可选的。
那里的关键字是可选的。很可能它是在您选择的平台上定义的,但对于遗留的可移植性,您最好将 avoid *
或声明一个专门的“句柄”返回给类型化或 void 指针并返回它。
与往常一样,我对任何使用兼容 C99 的平台的人完全感兴趣,该平台选择不公开标准中作为可选功能提供的某些功能(例如这个)。如果有人<stdint.h>
没有 intptr_t
和/或uintptr_t
我很好奇。如果您使用这样的工具链,请发表评论。
就像@nos 所说,如果您正在处理指针,那么请使用指针类型。将它们转换为整数是不可移植的并且容易出错。
如果您不希望调用者知道它是一个指针(无论如何都不需要挖掘),那么可以使用typedef
创建一个“句柄”类型,或者其他东西:
typedef my_ptr* object_handle;
事实上,即使你的“句柄”确实是一个整数,也要这样做。抽象将允许您稍后更改它,而无需修改任何调用代码。