Czy to dobry pomysł, aby użyć intptr_t
jako magazyn ogólnego przeznaczenia (do przechowywania wskaźników i wartości całkowite) zamiast void*
?
nr
intptr_t
nie gwarantuje istnieć. Po pierwsze, jak zauważyłeś, została wprowadzona w C99. Po drugie, implementacje nie muszą mieć typu całkowitoliczbowego wystarczająco dużego, aby pomieścić wartości konwertowanych wskaźników bez utraty informacji.
przekształcania int
do intptr_t
iz powrotem nieprawdopodobne stracić informacji, ale nie ma gwarancji, że rzeczywista intptr_t
jest szerszy niż int
.
Jeśli chcesz przechowywać wartości wskaźników, przechowuj je w obiektach wskaźnikowych. Do tego służą obiekty wskaźnikowe.
Każdy wskaźnik do obiektu lub niekompletny typ można przekonwertować na void*
iz powrotem, bez utraty informacji. Nie ma takiej gwarancji na wskaźniki dla funkcji - ale każdy wskaźnik typu funkcja może zostać przekonwertowany na dowolny inny wskaźnik na typ funkcji i z powrotem bez utraty informacji. (Odnoszę się do standardu C, myślę, że POSIX zapewnia dodatkowe gwarancje.)
Jeśli chcesz przechowywać wartość całkowitą lub wskaźnik w tym samym obiekcie, pierwszą rzeczą, którą powinieneś zrobić, jest ponowne przemyślenie twój projekt. Jeśli już to zrobiłeś i doszedłeś do wniosku, że naprawdę chcesz to zrobić, rozważ użycie unii (i uważnie śledząc, jaką wartość ostatnio przechowywałeś).
Istnieją interfejsy API używające argumentu void*
do umożliwienia przekazywania dowolnych danych; patrz na przykład funkcja POSIX pthread_create()
. Można to wykorzystać, rzucając wartość całkowitą na void*
, ale bezpieczniej jest przekazać adres adres obiektu całkowitoliczbowego.
Nie. (Jeśli tak, to po prostu dodaliby semantykę intptr_t do 'void *') –
Wpis pyta "(aby trzymać wskaźniki i wartości całkowite)", ale wtedy tylko omawia 'int',' void * 'i' intptr_t'. Jako 'uintmax_t',' size_t', 'long long', itp. Są również typu integer, brzmi to tak, jakby pytanie dotyczyło tylko wskaźników obiektów, typów' intptr_t' i 'int'. – chux