【发布时间】:2016-07-18 02:41:12
【问题描述】:
在 32 位平台上的 libc++ 中,int64_t 定义为 long long 的别名。在 64 位平台上:long。
另一方面在std::chrono::duration别名的定义中,你可以发现here long long被不小心使用了:
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;
因此,例如,当我需要严格为 8 个字节长的类型时,我希望
foo(uint64_t);
foo(int64_t);
成为一个相当便携的解决方案。但如果是 libc++ 的chrono,则不是这样。除了编写类似于<cstdint> 的自己的逻辑外,没有其他可移植的方法。即,定义foo 的两个附加定义,分别采用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,因此它可以按预期进行编译。
【问题讨论】:
-
有 64 位平台,其中
long是 32 位。检查 LP64 和 LLP64 平台之间的区别。请注意,这甚至是特定于编译器的,不仅针对平台,尽管通常存在某些约定。 -
@UlrichEckhardt 当然有,但是这有什么关系呢?库定义了
<cstdint>,那么为什么不将它用于所述库的其他部分的可移植性呢? -
我的意思是,你的前导句是错误的,如果我理解你的问题,完全不相关!难道不是归结为“为什么在一个平台上用
uint64_t定义duration而在另一个平台上用long long定义的问题?”顺便说一句:你有 mongodb 构建问题的链接吗? -
@UlrichEckhardt 问题将很快报告。真正的问题是为什么 libc++ 的开发者让库用户的生活变得更加艰难。
-
这里的问题到底是什么?