处理64/32位time_t [duplicate]的便携式方法

rdlzhqv9  于 2023-08-03  发布在  其他
关注(0)|答案(4)|浏览(102)

此问题在此处已有答案

Format specifiers for implementation-defined types like time_t(4个答案)
26天前关闭。
我有一些代码是建立在Windows和Linux上。Linux在这一点上总是32位的,但Windows是32和64位的。Windows希望time_t是64位的,Linux仍然是32位的。我很好,只是在某些地方time_t值被转换为字符串。因此,当time_t为32位时,应使用%d完成;当time_t为64位时,应使用%lld完成...
什么是聪明的方法来做到这一点?还有:有没有什么想法,我可以找到所有的地方,其中time_t的传递给printf风格的函数,以解决这个问题?

**编辑:**我提出了将TT_FMT声明为%d%lld,然后将printf更改为

printf("time: %d, register: blah")

字符串
以便

printf("time: " TT_FMT ", register: blah")


还有更好的办法吗?我该怎么找到他们呢?

cetgtptt

cetgtptt1#

根据C标准,time_t是算术类型,“能够表示时间”。例如,它可以是double。(Posix mentions this more explicitly,并且还保证time()返回自Epoch以来的秒数-C标准不保证后者。
也许最干净的解决方案是将值转换为您想要的任何类型。您可能需要unsigned long longunsigned long之一:

printf("%llu\n", (unsigned long long)t);

字符串

vof42yt1

vof42yt12#

我认为唯一真正可移植的方法是使用strftimetime_t转换为字符串。
如果你确定你只在time_tint的平台上操作,你可以转换为intmax_t(从stdint.h),并使用PRIdMAX(从inttypes.h)打印它。

inb24sb2

inb24sb23#

如果你想使用宏说明符,我建议你做一个小的调整。不封装整个说明符,只封装修饰符:

#ifdef 64_BIT_TIME
  #define TT_MOD "ll"
#else
  #define TT_MOD ""
#endif

字符串
然后像这样使用它:

printf("current time in seconds is: %" TT_MOD "u", time(0));


原因是,虽然您主要希望使用十进制的第二位,但有时您可能希望使用十六进制(或者您可能希望使用前导0)。通过在那里只使用修饰符,您可以轻松地编写:

"%" TT_MOD "x"   // in hex
"%08" TT_MOD "d"  // left pad with 0's so the number is at least 8 digits

t30tvxxf

t30tvxxf4#

对Alok的答案稍作调整,它在Windows和Linux上都有签名,所以:

printf("%lld\n", t);

字符串
更干净。

相关问题