32ビットプラットフォームのlibC++では、int64_t
は別名long long
と定義されています。 64ビットプラットフォーム:long
あなたはherelong long
が不用意に使用されて見つけることができることをstd::chrono::duration
エイリアスの定義における一方ClangのlibC++:std :: chrono :: durationの定義で長いlongを使用
:私は厳密に8バイト長のタイプを必要とする場合
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;
したがって、たとえば、私は
を期待しますfoo(uint64_t);
foo(int64_t);
かなりポータブルソリューションであること。しかしlibC++の場合、chrono
はそうではありません。 <cstdint>
に似た独自のロジックを書く以外に移植可能な方法はありません。つまり、foo
という2つの追加定義を定義すると、long long
とunsigned long long
となります。
それとも別の例:
foo(int8_t);
foo(int16_t);
foo(int32_t);
foo(int64_t);
foo(duration.count())
を呼び出すと、この場合にはあいまいになります。
long long
の使用ポイントはlong
以下ですが、ランクはlong
よりも大きいので、暗黙的にキャストすることはできません。これはlibc++
の開発者が見落とし
ですか?
mongodbのドライバは、x64 FreeBSDのインストール時にコンパイルされないためです。そしてその理由はやや愚かに見えます。例えば、GCCはstd::chrono::duration
の定義でint64_t
を使用すると予想されるように、それは、コンパイル。
'long 'が32ビットの64ビットプラットフォームがあります。 LP64とLLP64プラットフォームの違いを確認してください。特定の規則が通常存在するにもかかわらず、これはプラットフォームだけでなく、コンパイラ固有のものでもあることに注意してください。 –
@UlrichEckhardtもちろんありますが、これはこれをどうやって行うのですか?ライブラリは ''を定義していますので、そのライブラリの別の部分の移植性のために使用しないのはなぜですか? –
GreenScape
私の主張は、あなたが主導する文章が両方とも間違っていることです。私があなたの問題を理解すれば、完全に無関係です! "なぜ、' durationは '' uint64_t'で一つのプラットフォームで定義され、 '' long long''で定義されるのでしょうか? BTW:mongodbビルドの問題のリンクがありますか? –