指针大小,方法内的32位与64位指针大小,以及方法的返回值

时间:2012-11-30 11:41:01

标签: c pointers

我有一个方法

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

你有什么建议?谢谢!

2 个答案:

答案 0 :(得分:1)

如果你正在处理指针,要么使用指针返回类型,要么在标准定义的int类型中“隐藏”它以足以支持保持指针。这样的类型可以存在但保证存在(tmk):

  

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

     
      
  1. 以下类型指定一个带符号的整数类型,其属性是任何有效的void指针都可以转换为此类型,然后转换回指向void的指针,结果将等于原始指针:< / p>      

    <强>使用intptr_t

         

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

         

    <强> uintptr_t的

         

    这些类型是可选的

  2.   

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

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

答案 1 :(得分:0)

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

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

typedef my_ptr* object_handle;

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