便携式处理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 longunsigned long

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

我认为唯一真正可移植的方法是使用strftimetime_t转换为字符串。

如果您确定只在time_tint平台上运行,则可以转换为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