而不是void *?

使用intptr_t作为通用存储(保存指针和整数值)而不是void*是个好主意吗? (如此处所示:http://www.crystalspace3d.org/docs/online/manual/Api1_005f0-64_002dBit-Portability-Changes.html)

对于我已经读过的内容:

  • int - > void* - > int往返不保证保持原始值; 我猜int - > intptr_t - > int会做
  • void*intptr_t上的指针算术都需要强制转换,所以这里没有任何优势
  • void*表示存储指针时的较少显式转换, intptr_t表示存储整数值时较少转换
  • intptr_t需要C99
  • 还有什么我应该考虑的?


    使用intptr_t作为通用存储(保存指针和整数值)而不是void*是个好主意吗?

    没有。

    intptr_t不保证存在。 首先,正如你注意到的那样,它是在C99中引入的。 其次,实现不需要具有足够大的整数类型来保存转换的指针值而不会丢失信息。

    int转换为intptr_t并返回不会丢失信息,但不能保证intptr_tint更宽。

    如果要存储指针值,请将它们存储在指针对象中。 这就是指针对象的用途。

    任何指向对象或不完整类型的指针都可以转换为void*并再次返回而不丢失任何信息。 对函数指针没有这样的保证 - 但是任何指向函数的指针类型都可以转换为任何其他指针函数类型,并且不会丢失任何信息。 (我指的是C标准;我认为POSIX提供了一些额外的保证。)

    如果你想要在同一个对象中存储整数或指针值,你应该做的第一件事是重新考虑你的设计。 如果你已经这样做了,并得出结论说你确实想要这样做,那就考虑使用联盟(并且仔细跟踪你最近存储的是什么样的价值)。

    有些API使用void*参数来允许任意数据被传递; 例如,请参阅POSIX pthread_create()函数。 这可以通过将整数值转换为void*来滥用,但传递整数对象的地址更安全。


    不,不能保证任何特定的类型是存储指针和整数的合理方式,而且它会使代码混淆。 有一个更好的办法。

    如果你想在同一个对象中存储一个整数和一个指针,那么干净可移植的方法就是使用联合:

    union foo {
       int integer_foo;
       void *pointer_foo;
    }
    

    这是可移植的,并允许您存储两种存储大小所需的存储大小。 它保证始终工作。

    链接地址: http://www.djcxy.com/p/28371.html

    上一篇: t instead of void*?

    下一篇: return of malloc() function