2013-08-30 8 views
9

W printf i scanf rodziny funkcji w C zużywają garść prymitywnych formacie specyfikatorami które odpowiadają podstawowych typów danych – %d dla int, %llu dla unsigned long long int itdCzy Posix dostarcza makra łańcuchów formatów dla printf/scanf?

Jednakże, istnieje duża liczba standardowego typu aliasy, które chciałoby się używać w praktyce, takie jak int32fast_t, i nie można i nie należy znać podstawowego podstawowego typu. W przypadku aliasów w stdint.h, standard C z wdzięcznością określa zestaw makr do generowania odpowiednich ciągów formatów, takich jak PRI32, w inttypes.h.

Czy istnieje analogiczny zestaw makr dla Posix? Posix ma mnóstwo nieprzezroczystych typów, takich jak ssize_t, pid_t, rlim_t, suseconds_t itd., Które są odmianami podstawowych typów intgral. W jaki sposób można przenośnie używać tych typów w ciągach formatów?

+2

jeśli wszystko inne zawiedzie, zawsze możesz przekonwertować na '(u) intmax_t' i wydrukować to – Christoph

+0

Interesujące rozwiązania - nigdy o tym nie myślałem: -S –

+0

(Chociaż cofnięcie, czyli' scanf', musiałbym wykonaj ręczne sprawdzenie przepełnienia i wymyśl, co dokładnie porównać.) –

Odpowiedz

0

Posix gwarantuje, że wartości sys/types.h są "typem arytmetycznym o odpowiedniej długości", a kilka innych jest dodatkowo określanych jako unsigned lub signed 'extended length'. Jedynym standardem akceptowalnym sposobem ich wyprowadzania byłoby przeniesienie go za pomocą rzutowania w największym odpowiednim typie języka (u) intmax_t, a następnie wyprowadzenie go.

Wprowadzanie ich byłoby bardziej niebezpieczne (tj. Niemożliwe w sposób zgodny z normami), ponieważ trudno byłoby zagwarantować, że konwersja do typu podstawowego nie spowoduje przepełnienia.

1

Pakiet sfio (część AT & T Labs) ma funkcje analogiczne do printf i scanf, które pozwalają określić rozmiar wartości liczbowej (zazwyczaj z użyciem sizeof()) jako dodatkowego parametru. Kilka przykładów:

sfprintf(sfstdout, "%I*d", sizeof(intval), intval); 
sfscanf(sfstdin, "%I*f", sizeof(fltval), &fltval); 

Papier USENIX: Extended Data Formatting Using Sfio.