此问题在此处已有答案:
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")
型
还有更好的办法吗?我该怎么找到他们呢?
4条答案
按热度按时间cetgtptt1#
根据C标准,
time_t
是算术类型,“能够表示时间”。例如,它可以是double
。(Posix mentions this more explicitly,并且还保证time()
返回自Epoch以来的秒数-C标准不保证后者。也许最干净的解决方案是将值转换为您想要的任何类型。您可能需要
unsigned long long
或unsigned long
之一:字符串
vof42yt12#
我认为唯一真正可移植的方法是使用
strftime
将time_t
转换为字符串。如果你确定你只在
time_t
是int
的平台上操作,你可以转换为intmax_t
(从stdint.h
),并使用PRIdMAX
(从inttypes.h
)打印它。inb24sb23#
如果你想使用宏说明符,我建议你做一个小的调整。不封装整个说明符,只封装修饰符:
字符串
然后像这样使用它:
型
原因是,虽然您主要希望使用十进制的第二位,但有时您可能希望使用十六进制(或者您可能希望使用前导0)。通过在那里只使用修饰符,您可以轻松地编写:
型
t30tvxxf4#
对Alok的答案稍作调整,它在Windows和Linux上都有签名,所以:
字符串
更干净。