Was ist time_t letztlich ein typedef auf?
Suchte ich meine Linux-box und sah diese Typdefinition:
typedef __time_t time_t;
Aber ich konnte nicht finden die __time_t
definition.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Suchte ich meine Linux-box und sah diese Typdefinition:
typedef __time_t time_t;
Aber ich konnte nicht finden die __time_t
definition.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den time_t Wikipedia-Artikel Artikel wirft etwas Licht auf dieses. Die Quintessenz ist, dass die Art der
time_t
ist nicht garantiert in der C-Spezifikation.time_t
in die on-disk Struktur der Daten geschehen kann. Jedoch, da die Dateisysteme sind oft zu Lesen, die von anderen Betriebssystemen ist, wäre es dumm, um zu definieren, das Dateisystem basierend auf einer solchen Implementierung abhängige Arten. Zum Beispiel, das gleiche Dateisystem verwendet werden könnten, die auf 32-bit-und 64-bit-Systeme, undtime_t
könnte die Größe ändern. Damit sind Dateisysteme definiert werden müssen, mehr genau ("32-bit-signierte ganze Zahl, die die Anzahl von Sekunden seit Anfang 1970 (UTC)") als ebensotime_t
.time.h
Inhalt. Artikel-links zu cppreference.com aber der zitierte Inhalt ist nirgends zu finden...time_t
unterzeichnet ist, ist falsch. pubs.opengroup.org/onlinepubs/9699919799/basedefs/... vor, dass verschiedene Dinge, die muss ein "Ganzzahl-Typ" oder "unsigned Ganzzahl-Typ", aber dertime_t
es sagt lediglich, dass es "ist ein integer-Typ". Eine Umsetzung machen kanntime_t
unsigned und trotzdem POSIX-konform.[root]# cat time.c
[root]# gcc -E time.c | grep __time_t
typedef long int __time_t;
Er definiert in
$INCDIR/bits/types.h
durch:typedef __int32_t __time_t;
undtypedef __time_t time_t;
imFreeBSD freebsd-test 8.2-RELEASE-p2 FreeBSD 8.2-RELEASE-p2 #8: Sun Aug 7 18:23:48 UTC 2011 root@freebsd-test:/usr/obj/usr/src/sys/MYXEN i386
. Ihre Ergebnisse sind explizit festzulegen, wie das in Linux (zumindest auf 2.6.32-5-xen-amd64 Debian).Standards
Wilhelm Brendel zitiert Wikipedia, aber ich bevorzuge es aus dem Maul des Pferdes.
C99 N1256 standard-Entwurf 7.23.1/3 "Komponenten der Zeit" sagt:
und 6.2.5/18 "Typen" sagt:
POSIX-7 sys_types.h sagt:
wo
[CX]
ist definiert als:Es ist eine Erweiterung, denn es macht einen stärker-Garantie: schwimmende Punkte sind raus.
gcc one-liner
Keine Notwendigkeit, erstellen Sie eine Datei wie bereits erwähnt durch Quassnoi:
Auf Ubuntu 15.10 GCC 5.2 die oberen zwei Zeilen sind:
Befehl Zusammenbruch mit einigen Zitaten aus
man gcc
:-E
: "Stop nach der Vorverarbeitung Bühne, führen Sie nicht den richtigen compiler."-xc
: Geben Sie C-Sprache, die seit der input kommt von stdin, die hat keine Dateiendung.-include file
: "Prozess-Datei, als ob "#include "Datei"" erschien als die erste Zeile der primären Quelle-Datei".-
: Eingabe von stdinDie Antwort ist definitiv die Umsetzung-spezifisch. Um herauszufinden, definitiv für deine Plattform/compiler, fügen Sie einfach diese Ausgabe irgendwo in deinem code:
Wenn die Antwort ist 4 (32 bit) und Ihre Daten gemeint ist, darüber hinaus zu gehen Zwei tausend acht und dreißig, dann haben Sie 25 Jahre Migration der code.
Ihre Daten in Ordnung sein, wenn Sie Ihre Daten als ein string, auch wenn es etwas einfaches, wie:
Dann einfach nur Lesen, es den gleichen Weg zurück (fread, fscanf, etc. in eine int), und Sie haben Ihre Epoche offset-Zeit. Einen ähnlichen workaround existiert .Net. Ich pass 64-bit-Zeitalter zahlen zwischen Win-und Linux-Systemen kein problem (über einen Kommunikationskanal). Das bringt, byte-order-Probleme, aber das ist ein anderes Thema.
Beantworten paxdiablo die Abfrage, würde ich sagen, dass es die gedruckten "19100", denn das Programm wurde so geschrieben (und ich gebe zu, ich habe selbst in den 80 's):
Den
printf
- Anweisung druckt die Feste Zeichenfolge "Jahr: 19", gefolgt von einem null-string mit dem "Jahre seit 1900" (definition vontm->tm_year
). Im Jahr 2000, dass der Wert 100 ist, ist offenbar."%02d"
pads mit zwei Nullen, aber nicht abgeschnitten, wenn mehr als zwei Ziffern.Dem richtigen Weg ist (änderung der letzten Zeile nur):
Neue Frage: Was ist die Begründung für das denken?
%zu
Formatbezeichner formatierensize_t
Werte (als erbracht durchsizeof
), da Sie nicht signiert sind (u
) und der Länge size_t (z
)·printf ("sizeof time_t is: %d\n", (int) sizeof(time_t));
vermeiden und diez
Problem.Unter Visual Studio 2008 Standard ist eine
__int64
es sei denn, Sie definieren_USE_32BIT_TIME_T
. Du bist besser dran, nur vorzugeben, dass Sie nicht wissen, was es ist definiert, da es kann (und wird) ändern von Plattform zu Plattform.time_t
ist der Typlong int
auf 64-bit-Maschinen, sonst ist eslong long int
.Könnten Sie dies überprüfen, in diesen header-Dateien:
time.h
:/usr/include
types.h
undtypesizes.h
:/usr/include/x86_64-linux-gnu/bits
(Die nachfolgenden Aussagen sind nicht eins nach dem anderen. Sie konnte gefunden werden, in die bzw. header-Datei mithilfe von Strg+f suchen.)
1)In
time.h
2)
types.h
3)In
typesizes.h
4) Wieder in
types.h
long int
überall. Siehe stackoverflow.com/questions/384502/...Es ist ein 32-bit-Ganzzahl-Typ auf den meisten legacy-Plattformen. Jedoch, die bewirken, dass Ihr code zu leiden, die Jahr 2038 bug. So modern C-Bibliotheken sollte es zu definieren, um einen signierten 64-bit-int statt, die sicher für ein paar Milliarden Jahre.
In der Regel finden Sie diese zugrunde liegenden Implementierung-spezifischen Typdefinitionen für gcc in der
bits
oderasm
header-Verzeichnis. Für mich ist es/usr/include/x86_64-linux-gnu/bits/types.h
.Können Sie einfach grep, oder verwenden Sie eine preprocessor-Aufruf wie vorgeschlagen, durch Quassnoi, um zu sehen, welche spezifischen header.
Robusten code ist es egal, was der Typ ist.
C Arten
time_t
eine Typ real wiedouble, long long, int64_t, int
usw.Es könnte gar
unsigned
wie die Rückgabewerte aus vielen Zeit-Funktion, der angibt, Fehler ist nicht-1
, aber(time_t)(-1)
- Diese Implementierung Wahl ist ungewöhnlich.Der Punkt ist, dass die "need-to-know" der Typ ist selten. Sollten Code geschrieben werden, die Notwendigkeit zu vermeiden.
Doch eine gemeinsame "need-to-know" tritt auf, wenn code drucken möchte, der raw -
time_t
. Casting für die größte integer-Typ wird Platz für die meisten modernen Fällen.Casting zu einem
double
oderlong double
wird auch funktionieren, aber stellen ungenau dezimale Ausgabetime_t
ist nurtypedef
für 8 bytes (long long/__int64
), die allen Compilern und Betriebssystemen verstehen. Zurück in den Tagen, war es fürlong int
(4 bytes), aber nicht jetzt. Wenn man sich dietime_t
imcrtdefs.h
finden Sie die beiden Implementierungen, aber der OS wird die Verwendunglong long
.