¿Es una buena idea usar intptr_t
como dispositivo de almacenamiento de propósito general (para mantener los punteros y valores enteros) en lugar de void*
?
Nº
intptr_t
no está garantizado de existir. Primero, como nota, fue introducido en C99. En segundo lugar, no se requiere que las implementaciones tengan un tipo de entero lo suficientemente grande como para contener los valores del puntero convertido sin pérdida de información.
La conversión de una int
a intptr_t
y vuelta es poco probable perder la información, pero no hay garantía real que intptr_t
es más ancha que int
.
Si desea almacenar valores de puntero, guárdelos en objetos de puntero. Para eso están los objetos del puntero.
Cualquier puntero a un objeto o tipo incompleto se puede convertir a void*
y viceversa sin pérdida de información. No existe tal garantía para los punteros a las funciones, pero cualquier tipo de puntero a función se puede convertir a cualquier otro tipo de puntero a función y viceversa sin pérdida de información. (Me refiero al estándar C; creo que POSIX proporciona algunas garantías adicionales.)
Si desea almacenar un entero o un valor de puntero en el mismo objeto, lo primero que debe hacer es volver a pensar tu diseño. Si ya lo ha hecho y ha llegado a la conclusión de que realmente desea hacerlo, considere usar una unión (y lleve un registro detallado de qué tipo de valor ha almacenado más recientemente).
Hay API que utilizan un argumento void*
para permitir que se pasen datos arbitrarios; ver, por ejemplo, la función POSIX pthread_create()
. Se puede abusar de esto lanzando un valor entero a void*
pero es más seguro pasar la dirección de un objeto entero.
No. (Si lo fuera, entonces solo habrían agregado la semántica de intptr_t a 'void *') –
La publicación pregunta "(para contener punteros y valores enteros)", pero luego solo se trata 'int',' void * 'y' intptr_t'. Como 'uintmax_t',' size_t', 'long long', etc. también son tipos enteros, suena como que la pregunta es solo sobre punteros de objeto, tipos' intptr_t' y 'int'. – chux