Da diese Antwort immer noch abgestimmt wird, möchte ich darauf hinweisen, dass Sie fast nie in den Header-Dateien suchen müssen. Wenn Sie zuverlässigen Code schreiben möchten, ist es viel besser, wenn Sie sich den Standard ansehen. Eine bessere Frage als "Wie ist off_t
auf meinem Computer off_t
definiert?" Ist "Wie wird durch den Standard definiert?". Das Befolgen des Standards bedeutet, dass Ihr Code heute und morgen auf jedem Computer funktioniert.
In diesem Fall off_t
ist nicht durch den C-Standard definiert. Es ist Teil des POSIX-Standards, den Sie hier durchsuchen können .
Ist leider off_t
nicht sehr streng definiert. Alles, was ich finden konnte, um es zu definieren, ist auf der Seite über sys/types.h
:
blkcnt_t
und off_t
müssen ganzzahlige Typen sein.
Dies bedeutet, dass Sie nicht sicher sein können, wie groß es ist. Wenn Sie GNU C verwenden, können Sie anhand der Anweisungen in der folgenden Antwort sicherstellen, dass es sich um 64 Bit handelt. Oder besser, Sie können in eine Standardgröße konvertieren, bevor Sie sie auf den Draht legen. So funktionieren Projekte wie die Protokollpuffer von Google (obwohl dies ein C ++ - Projekt ist).
Daher denke ich, dass "Wo finde ich die Definition in meinen Header-Dateien?" Nicht die beste Frage ist. Der Vollständigkeit halber hier die Antwort:
Auf meinem Computer (und den meisten Computern, die glibc verwenden) finden Sie die Definition in bits/types.h
(wie ein Kommentar oben sagt, schließen Sie diese Datei niemals direkt ein), aber sie ist in einer Reihe von Makros etwas verdeckt. Eine Alternative zu dem Versuch, sie zu entwirren, besteht darin, sich die Präprozessorausgabe anzusehen:
#include <stdio.h>
#include <sys/types.h>
int main(void) {
off_t blah;
return 0;
}
Und dann:
$ gcc -E sizes.c | grep __off_t
typedef long int __off_t;
....
Wenn Sie jedoch die Größe von etwas wissen möchten, können Sie immer den sizeof()
Operator verwenden.
Edit: Hab gerade den Teil deiner Frage über die gesehen __
. Diese Antwort hat eine gute Diskussion . Der entscheidende Punkt ist, dass Namen, die mit beginnen __
, für die Implementierung reserviert sind (daher sollten Sie Ihre eigenen Definitionen nicht mit beginnen __
).
__
ist für die Verwendung durch die Implementierung reserviert (es sei denn, der Standard definiert eine Bedeutung dafür, wie in__func__
oder__FILE__
). Durch die Indirektionsebene kann die Implementierung ihren eigenen Typ definieren,__off_t
ohne dass Sie irgendetwas stören, was Sie rechtmäßig tun können. Die plattformspezifischen Bits der Header können dann besser ausgeblendet werden (sodass eine einzelne Kopie des Quellcodes beispielsweise 32-Bit- und 64-Bit-Kompilierungen auf einem einzelnen Computer verarbeiten kann). Das Lesen von Standardheadern ist eine große Aufgabe, da es so viele miteinander verknüpfte Definitionen gibt.