In libC++ auf 32-Bit-Plattformen ist int64_t
als Alias von long long
definiert. Auf 64-Bit-Plattformen: long
.Clang's libC++: long long in der Definition von std :: chrono :: duration verwenden
Auf der anderen Seite in der Definition von std::chrono::duration
Aliase, dass Sie finden herelong long
nachlässig verwendet wird:
typedef duration<long long, nano> nanoseconds;
typedef duration<long long, micro> microseconds;
typedef duration<long long, milli> milliseconds;
typedef duration<long long > seconds;
typedef duration< long, ratio< 60> > minutes;
typedef duration< long, ratio<3600> > hours;
So zum Beispiel, wenn ich Typen erfordern, die streng 8 Bytes lang ist, würde ich
erwartenfoo(uint64_t);
foo(int64_t);
eine ziemlich portable Lösung sein. Aber im Falle von libC++ chrono
ist es nicht wahr. Es gibt keinen tragbaren Weg, außer dass Sie Ihre eigene Logik ähnlich wie <cstdint>
schreiben. Dh, definieren zwei zusätzliche Definitionen von foo
, die long long
und unsigned long long
übernehmen.
Oder ein anderes Beispiel:
foo(int8_t);
foo(int16_t);
foo(int32_t);
foo(int64_t);
foo(duration.count())
aufrufen würde in diesem Fall nicht eindeutig sein.
Also was ist der Punkt der Verwendung von long long
, die nicht größer ist als long
, aber es ist Rang größer als long
, so dass es nicht implizit gegossen werden kann?
Ist dies ein Versehen von Entwicklern von libc++
?
Der Grund, warum ich dies heraufgebracht habe, ist, weil Treiber von mongodb nicht auf x64 FreeBSD Installation kompilieren. Und der Grund sieht ziemlich albern aus. Zum Beispiel gcc verwendet int64_t
in den Definitionen von std::chrono::duration
und so kompiliert, wie erwartet.
Es gibt 64-Bit-Plattformen, bei denen 'long' 32 Bit ist. Überprüfen Sie den Unterschied zwischen LP64 und LLP64-Plattformen. Beachten Sie, dass dies sogar compilerspezifisch ist, nicht nur für die Plattform, obwohl in der Regel bestimmte Konventionen existieren. –
@UlrichEckhardt natürlich gibt es, aber was hat das zu tun, die Frage? Bibliothek definiert '', warum also nicht für die Portabilität anderer Teile der Bibliothek verwenden? –
GreenScape
Mein Punkt ist, dass Sie Satz ist falsch und, vorausgesetzt, ich verstehe dein Problem, völlig irrelevant! Geht es nicht um die Frage "Warum ist" duration "mit" uint64_t "auf einer Plattform definiert und" long long "auf einer anderen?" Übrigens: Hast du einen Link für die mongodb Build Probleme? –