eff*_*tom 24 c printf typedef time-t
我想让我的代码更加平台/实现独立.time_t在编译代码时,我不知道将在平台上实现什么.我如何知道t要确定使用哪种格式说明符的类型?
...
time_t t = time(NULL);
printf("%s", t);
...
Run Code Online (Sandbox Code Playgroud)
Kei*_*son 24
通常,您可以使用强制转换将操作数转换为您知道正确格式的某种类型.
您提出的解决方案
time_t t = time(NULL);
printf("%s", t);
Run Code Online (Sandbox Code Playgroud)
显然将无法工作,因为time_t是数字类型,而不是char*.
我们知道,一般来说,这time_t是一种算术类型.像这样的东西:
printf("%ld\n", (long)t);
Run Code Online (Sandbox Code Playgroud)
可能适用于大多数系统.它可能失败(a)如果time_t是无符号类型且不超过unsigned long当前值且t超过LONG_MAX,或(b)如果time_t是浮点类型.
如果你有C99支持,你可以使用long long,这是一个更好的:
printf("%lld\n", (long long)t);
Run Code Online (Sandbox Code Playgroud)
如果您真的希望过度使用可移植性,可以检测出哪种类型time_t:
if ((time_t)-1 > 0) {
// time_t is an unsigned type
printf("%ju\n", (uintmax_t)t);
}
else if ((time_t)1 / 2 > 0) {
// time_t is a signed integer type
printf("%jd\n", (intmax_t)t);
}
else {
// time_t is a floating-point type (I've never seen this)
printf("%Lg\n", (long double)t);
}
Run Code Online (Sandbox Code Playgroud)
您可能希望将%Lg格式调整为%Lf或类似%.10Lf,具体取决于您想要的输出格式.
再次,这假设C99支持 - 你需要#include <stdint.h>制作uintmax_t和intmax_t可见.
time_t并且clock_t有点不寻常,因为标准只表示它们是能够代表时间的算术类型.(原则上它们可能是复杂的类型,但我会说忽略这种可能性值得冒险.)
在大多数其他情况下,您可能知道给定类型是有符号类型,无符号类型还是浮点数,并且您只能转换为最类型的类型.
请注意,如果您不知道如何time_t表示,您可能也不会理解printf(例如1379375215)的输出- 除非您的目标是弄明白.
(如果您使用C++而不是C编程,std::cout << t << "\n";则会自动使用正确的重载operator<<.)
如果你想要人类可读的输出(比如Mon 2013-09-16 16:46:55 PDT),你会想要使用其中一个声明的转换函数<time.h>,比如asctime()或strftime().
Eri*_*hil 10
通常,显示a值的方法time_t是将其组件分解为struct tm使用gmtime或localtime显示它们或根据需要转换它们strftime,或者ctime直接转到time_t显示本地时间的字符串.
如果您希望出于某种目的看到原始值,则C标准指定它time_t是实数,这意味着它是整数或浮点数(C 2011(N1570)6.2.5 17).因此,您应该能够将其转换为double并打印出来.有一种可能性time_t可以表示double不能的值,因此如果您想要关注异国情调的实施,您可能需要防范这种情况.由于difftime返回两个time_t对象的差异作为a double,似乎C并不真正支持time_t比a更精确double.
你可以difftime()用来获得double:
time_t t = time(NULL);
printf("seconds 1970->now: %.f\n", difftime(t, (time_t) 0));
Run Code Online (Sandbox Code Playgroud)
它很简单,我认为它是便携式的.