使用是一个好主意吗intptr_t
作为通用存储(保存指针和整数值)而不是void*
? (如下所示:http://www.crystalspace3d.org/docs/online/manual/Api1_005f0-64_002dBit-Portability-Changes.html)
对于我已经读过的内容:
-
int
-> void*
-> int
往返不保证保持原值;我猜int
-> intptr_t
-> int
will do
- 两者的指针算术
void*
and intptr_t
需要强制转换,所以这里没有人获得优势
-
void*
意味着存储指针时更少显式转换,intptr_t
意味着存储整数值时更少的强制转换
-
intptr_t
需要 C99
我还应该考虑什么?
使用是一个好主意吗intptr_t
作为通用存储(保存指针和整数值)而不是void*
?
No.
intptr_t
不保证存在。首先,正如您所注意到的,它是在 C99 中引入的。其次,实现不需要具有足够大的整数类型来保存转换后的指针值而不丢失信息。
转换一个int
to intptr_t
后面是unlikely丢失信息,但并不能真正保证intptr_t
比int
.
如果要存储指针值,请将它们存储在指针对象中。这就是指针对象的用途。
任何指向对象或不完整类型的指针都可以转换为void*
并再次返回而不会丢失信息。指向函数的指针没有这样的保证——但是任何指向函数的指针类型都可以转换为任何其他指向函数的指针类型并转换回来,而不会丢失信息。 (我指的是 C 标准;我认为 POSIX 提供了一些额外的保证。)
如果您想在同一个对象中存储整数或指针值,您应该做的第一件事就是重新考虑您的设计。如果您已经这样做了,并且得出结论您确实想要这样做,请考虑使用联合(并仔细跟踪您最近存储的值类型)。
有些 API 使用void*
允许传递任意数据的参数;例如,参见 POSIXpthread_create()功能。这可以通过将整数值转换为来滥用void*
但通过这个更安全address一个整数对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)