Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Pali 16. 06. 2011, 15:12:00
-
Ahojte, aky je standartny sposob, resp. aka konstrukcia sa ma pouzit ak chcem pomocou printf vypisat hodnotu premennej typu size_t (tak aby to bolo platformovo nezavisle)? size_t moze byt na 32 a 64 bit. systemoch roznej velkosti.
-
ja bych pouzil %d.
-
%zd
-
%d je urcite nespravne (size_t moze byt kludne aj long int)
%zd vyzera rozumne (aspon co som teraz nasiel)
aky je rozdiel medzi %zd a %zu ?
-
d - signed int --- %zd pre ssize_t
u - unsigned int --- %zu pre size_t
-
Dik,
takze potom spravne ma byt:
%zu
-
ano ... zavisi ci je to typu size_t alebo ssize_t (hodnotu typu ssize_t vracia napr. read(2), write(2))
pre size_t pouzite %zu
a pre ssize_t pouzite %zd
-
$ cc -Wall -pedantic -ansi a.c
a.c: In function 'main':
a.c:8: warning: ISO C90 does not support the 'z' printf length modifier
Zaroven je dobre mit na pameti, ze int64_t je nekde definovany jako long, a nekde jako long long. Nicmene minimalne debiani gcc + gnu libc to jaksi ignoruje a vypisuje nesmyslne warningy. Potom mate na vyber mezi takovymto kodem:
#if LONG_MAX == LLONG_MAX && defined(__linux__)
"%ld",
#else
"%lld",
#endif
a nebo pouzitim prasaren typu PRId64, ktere samozrejme nejsou rozsirene ani pekne.
Uzijte si to :-)
-
$ cc -Wall -pedantic -ansi a.c
a.c: In function 'main':
a.c:8: warning: ISO C90 does not support the 'z' printf length modifier
no ano ... "-ansi" tak trochu redukuje "pohodlne programovanie" :)
Zaroven je dobre mit na pameti, ze int64_t je nekde definovany jako long, a nekde jako long long. Nicmene minimalne debiani gcc + gnu libc to jaksi ignoruje a vypisuje nesmyslne warningy. Potom mate na vyber mezi takovymto kodem:
#if LONG_MAX == LLONG_MAX && defined(__linux__)
"%ld",
#else
"%lld",
#endif
a nebo pouzitim prasaren typu PRId64, ktere samozrejme nejsou rozsirene ani pekne.
Uzijte si to :-)
no pouzitie %z by prave malo riesit to ako je int64_t definovany ...
-
prirad si to do unsigned long a vypis pres %lu
-
Pokud cloveku jde o to striktni ISO C, tak bych pouzil makro PRIiPTR z <inttypes.h>. Ktere se rozvyne na sekvenci znaku za % pro tisk uintptr_t pricemz je asi rozumne predpokladat, ze bezne nenarazite na platformu kde uintptr_t a size_t jsou ruzne typy a zaroven ja pro ni k dispozici kompilator ISO C.