Portál AbcLinuxu, 6. listopadu 2025 12:14
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.
je definovanej v souboru unistd.h, takze pokud to tazatel chce jako makro, tak staci napsat:
#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.