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

标签 c printf typedef time-t

我想让我的代码更独立于平台/实现。我不知道编译代码时平台上将实现什么time_t。我如何知道 t 的类型以确定要使用的格式说明符?

...
time_t t = time(NULL);
printf("%s", t);
...

最佳答案

通常您可以使用强制转换将操作数转换为您知道正确格式的某种类型。

您提出的解决方案:

time_t t = time(NULL);
printf("%s", t);

很明显不会工作,因为time_t是数字类型,不是 char* .

我们知道,一般来说,time_t是算术类型。像这样:

 printf("%ld\n", (long)t);

可能适用于大多数系统。它可能会失败 (a) 如果 time_t是不宽于 unsigned long 的无符号类型和 t 的当前值超过 LONG_MAX ,或 (b) 如果 time_t是浮点型。

如果你有 C99 支持,你可以使用 long long ,这样好一点:

printf("%lld\n", (long long)t);

如果你真的想过分追求便携性,你可以检测什么样的类型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);
}

您可能想要调整 %Lg格式为类似 %Lf 的格式或 %.10Lf ,取决于您想要的输出格式。

同样,这假设支持 C99——您将需要 #include <stdint.h>制作uintmax_tintmax_t可见。

time_tclock_t有点不寻常,因为标准说它们是能够表示时间的算术类型。 (原则上它们可以是复杂类型,但我认为忽略这种可能性是值得冒险的。)

在大多数其他情况下,您可能会知道给定类型是有符号、无符号还是浮点型,并且您可以转换为该类型中最宽的类型。

注意如果你不知道如何time_t表示,您可能不会理解 printf 的输出(例如 1379375215)要么 - 除非你的目标是弄清楚。

(如果您使用 C++ 而不是 C 进行编程,std::cout << t << "\n"; 将自动使用正确的重载 operator<<。)

如果你想要人类可读的输出(比如Mon 2013-09-16 16:46:55 PDT),你需要使用在<time.h>中声明的转换函数之一。 ,例如 asctime()strftime() .

关于c - 实现定义类型的格式说明符,如 time_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18839043/

相关文章:

我可以在不损失精度的情况下打印完全可表示的 float 吗?

c - 如何计算字符串中回文单词的数量?

Java - 格式化 double 组

使用 printf 时,C fork 是父级的副本

具有奇怪范围解析运算符的 C++ typedef

c - Typedeffed 结构未定义,但已定义

c++ - OpenGL 旋转 2D 纹理

c - 套接字连接失败

java - 当某些字符串具有不同长度时,如何格式化多个字符串以获得相等的间距

c++ - typedef 上与 CRTP 相关的编译器错误