我搜索我的Linux盒子,看到这样的类型定义:
typedef __time_t time_t;
但是我找不到__time_t的定义。
我搜索我的Linux盒子,看到这样的类型定义:
typedef __time_t time_t;
但是我找不到__time_t的定义。
当前回答
time_t维基百科的文章给出了一些解释。归根结底,在C规范中,time_t的类型是不保证的。
The time_t datatype is a data type in the ISO C library defined for storing system time values. Such values are returned from the standard time() library function. This type is a typedef defined in the standard header. ISO C defines time_t as an arithmetic type, but does not specify any particular type, range, resolution, or encoding for it. Also unspecified are the meanings of arithmetic operations applied to time values. Unix and POSIX-compliant systems implement the time_t type as a signed integer (typically 32 or 64 bits wide) which represents the number of seconds since the start of the Unix epoch: midnight UTC of January 1, 1970 (not counting leap seconds). Some systems correctly handle negative time values, while others do not. Systems using a 32-bit time_t type are susceptible to the Year 2038 problem.
其他回答
在大多数传统平台上,它是一个32位有符号整数类型。然而,这会导致您的代码遭受2038年的错误。因此,现代C库应该将其定义为有符号的64位整型,这在几十亿年里是安全的。
[根]#猫时间
#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
通常,您将在bits或asm头目录中找到这些用于gcc的底层实现特定的typedefs。对我来说,是/usr/include/x86_64-linux-gnu/bits/types.h。
您可以只使用grep,或者使用Quassnoi建议的预处理器调用来查看哪个特定的头文件。
time_t只是8字节的类型定义(long long/__int64),所有编译器和操作系统都理解。在过去,它只用于长int(4字节),但现在不是了。如果你查看crtdef .h中的time_t,你会发现这两种实现,但操作系统将使用long long。
您可以使用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