Dal momento che questa risposta viene comunque votato, voglio sottolineare che si dovrebbe quasi mai bisogno di guardare nei file di intestazione. Se vuoi scrivere un codice affidabile, ti servirà molto meglio guardando nello standard. Una domanda migliore di "come è definito off_t
sulla mia macchina" è "come è definito lo standard off_t
dallo standard?". Seguire lo standard significa che il tuo codice funzionerà oggi e domani, su qualsiasi macchina.
In questo caso, off_t
non è definito dallo standard C. Fa parte dello standard POSIX, che è you can browse here.
Sfortunatamente, off_t
non è definito molto rigorosamente. Tutto quello che potevo trovare per definirlo è nella pagina on sys/types.h
:
blkcnt_t
e off_t
è firmato tipi interi.
Ciò significa che non si può essere sicuri di quanto sia grande. Se si utilizza GNU C, è possibile utilizzare le istruzioni in the answer below per assicurarsi che siano 64 bit. O meglio, è possibile convertire in una dimensione definita standard prima di metterlo sul filo. Questo è il modo in cui funzionano progetti come il Protocol Buffers di Google (anche se si tratta di un progetto C++).
Quindi, penso che "dove trovo la definizione nei miei file di intestazione" non è la migliore domanda. Ma, per completezza ecco la risposta:
Troverete la definizione in bits/types.h
(come commento dice in alto, non includere direttamente questo file), ma è un po 'oscurata in un mucchio di macro. Un'alternativa a cercare di svelare loro è quello di osservare l'output del preprocessore:
#include <stdio.h>
#include <sys/types.h>
int main(void) {
off_t blah;
return 0;
}
E poi:
$ gcc -E sizes.c | grep __off_t
typedef long int __off_t;
....
Tuttavia, se si desidera conoscere la dimensione di qualcosa, si può sempre utilizzare il sizeof()
operatore.
Modifica: Ho appena visto la parte della tua domanda sullo __
. This answer has a good discussion. Il punto chiave è che i nomi che iniziano con __
sono riservati per l'implementazione (quindi non si dovrebbero iniziare le proprie definizioni con __
).
Tutto ciò che inizia con '__' è riservato per l'uso dal implementazione (a meno che lo standard non ne definisca un significato, come in '__func__' o' __FILE__'). Il livello di riferimento indiretto consente all'implementazione di definire il proprio tipo "__off_t" senza interferire con ciò che è legittimo. I bit specifici delle piattaforme delle intestazioni possono quindi essere meglio nascosti (quindi una singola copia del codice sorgente può gestire le compilazioni a 32 e 64 bit su una singola macchina, ad esempio). Leggere le intestazioni standard è un compito importante perché ci sono così tante definizioni interconnesse. –