我搜索我的Linux盒子,看到这样的类型定义:
typedef __time_t time_t;
但是我找不到__time_t的定义。
我搜索我的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
其他回答
通常,您将在bits或asm头目录中找到这些用于gcc的底层实现特定的typedefs。对我来说,是/usr/include/x86_64-linux-gnu/bits/types.h。
您可以只使用grep,或者使用Quassnoi建议的预处理器调用来查看哪个特定的头文件。
在Visual Studio 2008中,它默认为__int64,除非你定义了_USE_32BIT_TIME_T。最好是假装不知道它的定义,因为它可以(也将)在不同平台之间改变。
在64位机器上,Time_t的类型为long int,否则为long long int。
你可以在这些头文件中验证这一点:
time.h: /usr/include Types.h和typeszes .h: /usr/include/x86_64-linux-gnu/bits
(下面的陈述不是一个接一个的。他们可以在答复中找到。头文件使用Ctrl+f搜索。)
1)在time.h
typedef __time_t time_t;
2)在types.h
# define __STD_TYPE typedef
__STD_TYPE __TIME_T_TYPE __time_t;
3)在typesizes.h
#define __TIME_T_TYPE __SYSCALL_SLONG_TYPE
#if defined __x86_64__ && defined __ILP32__
# define __SYSCALL_SLONG_TYPE __SQUAD_TYPE
#else
# define __SYSCALL_SLONG_TYPE __SLONGWORD_TYPE
#endif
4)再次在types.h
#define __SLONGWORD_TYPE long int
#if __WORDSIZE == 32
# define __SQUAD_TYPE __quad_t
#elif __WORDSIZE == 64
# define __SQUAD_TYPE long int
#if __WORDSIZE == 64
typedef long int __quad_t;
#else
__extension__ typedef long long int __quad_t;
标准
威廉·布伦德尔引用了维基百科,但我更喜欢它来自马的嘴。
C99 N1256标准草案7.23.3 /3“时间组件”说:
声明的类型是size_t(在7.17中描述)clock_t和time_t,它们是能够表示时间的算术类型
6.2.5/18“类型”说明:
整型和浮动类型统称为算术类型。
POSIX 7 sys_types.h说:
[CX] time_t为整数类型。
其中[CX]定义为:
[CX] ISO C标准的扩展。
它是一种扩展,因为它提供了更强有力的保证:浮点数过时了。
gcc一行程序
不需要像Quassnoi提到的那样创建一个文件:
echo | gcc -E -xc -include 'time.h' - | grep time_t
在Ubuntu 15.10 GCC 5.2中,前两行是:
typedef long int __time_t;
typedef __time_t time_t;
命令分解和来自man gcc的一些引用:
-E:“预处理阶段结束后停止;不要正确运行编译器。” -xc:指定C语言,因为输入来自stdin,没有文件扩展名。 -include file: "处理文件,如果"#include "file""出现为主源文件的第一行。" -: stdin输入
time_t只是8字节的类型定义(long long/__int64),所有编译器和操作系统都理解。在过去,它只用于长int(4字节),但现在不是了。如果你查看crtdef .h中的time_t,你会发现这两种实现,但操作系统将使用long long。