实现定义类型的格式说明符,如time_t

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.


chu*_*hus 5

你可以difftime()用来获得double:

time_t t = time(NULL);
printf("seconds 1970->now: %.f\n", difftime(t, (time_t) 0));
Run Code Online (Sandbox Code Playgroud)

它很简单,我认为它是便携式的.