Portál AbcLinuxu, 10. května 2025 02:41
Potrebujem aby to slo aspon na POSIX kompatibilnych systemoch.
Dakujem
if((int)ptr % zarovnani == 0) { ...
sizeof(int) != sizeof(void*)
tak na big-endian by to asi nefungovalo... intptr_t
.
#include <unistd.h> #define TEST_MEMORY_ALIGNMENT(p, a) ((intptr_t)(p) % (a) == 0)a melo by to bejt prenositelny...
intptr_t
není definován v <unistd.h>
ale v <stdint.h>
.
#include <unistd.h> int main(int argc, int argv) { intptr_t x = 0; }stejne jako tenhle:
#include <stdint.h> int main(int argc, int argv) { intptr_t x = 0; }takze
<unistd.h>
mozna vklada <stdint.h>
<unistd.h>
includuje <stdint.h>
. Rozdíl je v tom, že zatímco hlavičkový soubor <stdint.h>
je definován přímo standardem jazyka C, <unistd.h>
je specifický pro posixové platformy.
Moj dotaz ale znel: existuje (kde je definovane) makro alebo funckia niekde v systemovych knizniciach, ktora to riesi. To znamena, ze nemusim mat plno ifdef pre rozne platformy, ktora sa celkom lisia.
Ak sa k tomu nedostanem, tak samozrejme definujem to makro samozrejme sam a budem musiet skumat, ako to je pre rozne platformy, z coho nie som velmi nadseny...
Kazdopadne ale dakujem za rady.
intptr_t
je pouze garantováno, že konverze jakéhokoli pointeru na intptr_t
a zpět zachová hodnotu (tj. že intptr_t
je "dost velký, aby se do něj vešel pointer"). Což v důsledku de facto implikuje sizeof(intptr_t) >= sizeof(void*)
. Ale stejná velikost garantována není.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.