我搜索我的Linux盒子,看到这样的类型定义:

typedef __time_t time_t;

但是我找不到__time_t的定义。


当前回答

您可以使用typeid来找出time_t在您的系统中是如何定义的。

#include <iostream> // cout
#include <ctime>    // time_t
#include <typeinfo> // typeid, name

using namespace std;

int main()
{
    cout << "Test 1: The type of time_t is: \t\t" 
         << typeid(time_t).name() << endl;
    cout << "Test 2: time_t is a signed long?: \t"
         << (typeid(time_t) == typeid(signed long) ? "true" : "false") << endl;
    cout << "Test 3: time_t is an unsigned long?: \t" 
         << (typeid(time_t) == typeid(unsigned long) ? "true" : "false") << endl;
    return 0;
}

在我的系统中,输出是:

Test 1: The type of time_t is:          l
Test 2: time_t is a signed long?:       true
Test 3: time_t is an unsigned long?:    false

其他回答

在Visual Studio 2008中,它默认为__int64,除非你定义了_USE_32BIT_TIME_T。最好是假装不知道它的定义,因为它可以(也将)在不同平台之间改变。

[根]#猫时间

#include <time.h>

int main(int argc, char** argv)
{
        time_t test;
        return 0;
}

[root]# gcc -E time.c | grep __time_t .c

类型定义long int __time_t;

它在$INCDIR/bits/types.h中定义:

# 131 "/usr/include/bits/types.h" 3 4
# 1 "/usr/include/bits/typesizes.h" 1 3 4
# 132 "/usr/include/bits/types.h" 2 3 4

time_t只是8字节的类型定义(long long/__int64),所有编译器和操作系统都理解。在过去,它只用于长int(4字节),但现在不是了。如果你查看crtdef .h中的time_t,你会发现这两种实现,但操作系统将使用long long。

通常,您将在bits或asm头目录中找到这些用于gcc的底层实现特定的typedefs。对我来说,是/usr/include/x86_64-linux-gnu/bits/types.h。

您可以只使用grep,或者使用Quassnoi建议的预处理器调用来查看哪个特定的头文件。

time_t类型定义最终是什么?

健壮的代码并不关心类型是什么。

C物种time_t为实类型,如double, long long, int64_t, int等。

它甚至可以是无符号的,因为许多时间函数的返回值表明错误不是-1,而是(time_t)(-1) -这种实现选择并不常见。

关键是“需要知道”的类型很少。代码的编写应该避免这种需要。


然而,当代码想要打印原始time_t时,会出现一个常见的“需要知道的问题”。转换为最宽的整数类型将适应大多数现代情况。

time_t now = 0;
time(&now);
printf("%jd", (intmax_t) now);
// or 
printf("%lld", (long long) now);

转换为双精度或长双精度也可以,但可能提供不精确的十进制输出

printf("%.16e", (double) now);