gpt4 book ai didi

c - 使用 intptr_t 而不是 void*?

转载 作者:太空狗 更新时间:2023-10-29 16:25:14 30 4
gpt4 key购买 nike

使用 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

我还应该考虑什么?

最佳答案

Is it a good idea to use intptr_t as a general-purpose storage (to hold pointers and integer values) instead of void*?

没有。

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

int 转换为 intptr_t 并返回 不太可能 丢失信息,但没有实际保证 intptr_tint 更宽。

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

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

如果您想在同一个对象中存储一个整数或一个指针值,您应该做的第一件事就是重新考虑您的设计。如果您已经这样做,并且得出结论认为您确实想要这样做,请考虑使用 union (并仔细跟踪您最近存储的值类型)。

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

关于c - 使用 intptr_t 而不是 void*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9492798/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com