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

MK.*_*MK. 16 c portability 32bit-64bit

我有一些代码,它们都是在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",然后将我的printfs更改为printf("time:%d,register:blah")为printf("time:"TT_FMT",注册:blah")有更好的方法吗?我如何找到它们?

Alo*_*hal 11

根据C标准,time_t是一种算术类型,"能够代表时间".所以,它可能是double例如.(Posix 更明确地提到这一点,并且还保证time()返回自Epoch以来的秒数 - 后者不受C标准保证.)

也许最干净的解决方案是将值转换为您想要的任何类型.你可能想要一个unsigned long longunsigned long:

printf("%llu\n", (unsigned long long)t);
Run Code Online (Sandbox Code Playgroud)


por*_*ges 7

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

如果你确定,你只能在平台上操作的地方time_tint,你可以转换为intmax_t(从stdint.h),并使用打印PRIdMAX(从inttypes.h).

  • 现在,(在这个答案之后 9 年),你可以使用 `%jd` 代替 `PRIdMAX`,如 `snprintf(str, sizeof(str), "%jd", (intmax_t)i_am_a_time_t_var)` (2认同)