0

我有一个方法

**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 的一部分。

你有什么建议?谢谢!

4

2 回答 2

1

如果您正在处理指针,请使用指针返回类型,或者将其“隐藏”在标准定义的 int 类型中,使其足够大以支持持有指针。这种类型可以存在但不保证存在(tmk):

C99 7.20.1.4能够保存对象指针的整数类型

  1. 以下类型指定了一个有符号整数类型,其属性是任何指向 void 的有效指针都可以转换为此类型,然后转换回指向 void 的指针,结果将与原始指针进行比较:

    intptr_t

    以下类型指定了一个无符号整数类型,其属性是任何指向 void 的有效指针都可以转换为此类型,然后转换回指向 void 的指针,结果将与原始指针进行比较:

    uintptr_t

    这些类型是可选的

那里的关键字是可选的。很可能它是在您选择的平台上定义的,但对于遗留的可移植性,您最好将 avoid *或声明一个专门的“句柄”返回给类型化或 void 指针并返回它。

与往常一样,我对任何使用兼容 C99 的平台的人完全感兴趣,该平台选择公开标准中作为可选功能提供的某些功能(例如这个)。如果有人<stdint.h> 没有 intptr_t和/或uintptr_t我很好奇。如果您使用这样的工具链,请发表评论。

于 2012-11-30T20:26:36.110 回答
0

就像@nos 所说,如果您正在处理指针,那么请使用指针类型。将它们转换为整数是不可移植的并且容易出错。

如果您不希望调用者知道它是一个指针(无论如何都不需要挖掘),那么可以使用typedef创建一个“句柄”类型,或者其他东西:

typedef my_ptr* object_handle;

事实上,即使你的“句柄”确实是一个整数,也要这样做。抽象将允许您稍后更改它,而无需修改任何调用代码。

于 2012-11-30T13:54:07.673 回答