便携式处理64/32位time_t的方法
我有一些代码,它们都是在Windows和Linux上构建的。 此时的Linux总是32位,但Windows是32位和64位。 Windows希望time_t为64位,而Linux仍然将其作为32位。 我很好,除了在某些地方time_t值转换为字符串。 所以当time_T是32位时,它应该用%d完成,当它是64位时用%lld …这样做的聪明方法是什么? 另外:任何想法我如何找到time_t传递给printf样式函数来解决这个问题的所有地方?
编辑:我想出将TT_FMT声明为“%d”或“%lld”,然后将printf中的printfs(“time:%d,register:blah”)更改为printf(“time:”TT_FMT“,注册:blah“)有更好的方法吗? 我如何找到它们?
根据C标准, time_t
是算术类型,“能够表示时间”。 所以,它可能是double
的例子。 (Posix 更明确地提到了这一点 ,并且还保证time()
返回自Epoch以来的秒数 – 后者不受C标准的保证。)
也许最干净的解决方案是将值转换为您想要的任何类型。 你可能想要一个unsigned long long
或unsigned long
:
printf("%llu\n", (unsigned long long)t);
我认为唯一真正可移植的方法是使用strftime
将time_t
转换为字符串。
如果您确定只在time_t
为int
平台上运行,则可以转换为intmax_t
(来自stdint.h
)并使用PRIdMAX
(来自inttypes.h
)进行打印。
如果你想使用宏说明符,我会建议一个小调整。 而不是封装整个说明符,只封装修饰符:
#ifdef 64_BIT_TIME #define TT_MOD "ll" #else #define TT_MOD "" #endif
然后像这样使用它:
printf("current time in seconds is: %" TT_MOD "u", time(0));
原因在于,当你主要想要十进制的十进制时,你经常需要hex(或者你想要前导0)。 只需要在那里使用修饰符,您就可以轻松地编写:
"%" TT_MOD "x" // in hex "%08" TT_MOD "d" // left pad with 0's so the number is at least 8 digits