【C语言】时间结构体
本文主要就C语言中常用类型time_t具体分析。
一、定义
1.首先来看一下定义,原来是一种类型重命名。
/* File: /usr/include/time.h */
typedef __time_t time_t;
库文件中使用的其实是__time_t
这个命名。
/* File: /usr/include/bits/time.h */
struct timeval
{
__time_t tv_sec; /* Seconds. */
__suseconds_t tv_usec; /* Microseconds. */
};
2.接着看进一步的定义
/* File: /usr/include/bits/types.h */
__STD_TYPE __TIME_T_TYPE __time_t; /* Seconds since the Epoch. */
__STD_TYPE __USECONDS_T_TYPE __useconds_t; /* Count of microseconds. */
__STD_TYPE __SUSECONDS_T_TYPE __suseconds_t; /* Signed count of microseconds. */
__STD_TYPE
可以简单地理解为typedef
。
首先__WORDSIZE
是一个用于指示目标平台数据类型大小的宏。它的值取决于编译器以及编译时的目标架构。在 32位系统 中,__WORDSIZE
通常为 32。在 64位系统 中,__WORDSIZE
通常为 64。
__extension__
关键字的作用是告诉编译器允许使用非标准扩展。通常是为了提高兼容性或使用特定平台/编译器的特性。
所以结合起来看的话,如果我们用的是64位系统,那么这里的__STD_TYPE
就是typedef
。
#if __WORDSIZE == 32
# define __SQUAD_TYPE __quad_t
# define __UQUAD_TYPE __u_quad_t
# define __SWORD_TYPE int
# define __UWORD_TYPE unsigned int
# define __SLONG32_TYPE long int
# define __ULONG32_TYPE unsigned long int
# define __S64_TYPE __quad_t
# define __U64_TYPE __u_quad_t
/* We want __extension__ before typedef's that use nonstandard base types
such as `long long' in C89 mode. */
# define __STD_TYPE __extension__ typedef
#elif __WORDSIZE == 64
# define __SQUAD_TYPE long int
# define __UQUAD_TYPE unsigned long int
# define __SWORD_TYPE long int
# define __UWORD_TYPE unsigned long int
# define __SLONG32_TYPE int
# define __ULONG32_TYPE unsigned int
# define __S64_TYPE long int
# define __U64_TYPE unsigned long int
/* No need to mark the typedef with __extension__. */
# define __STD_TYPE typedef
#else
# error
#endif
3.继续上面的定义
可以看成是typedef __TIME_T_TYPE __time_t; /* Seconds since the Epoch. */
那__TIME_T_TYPE
又是如何定义的呢?
/* File: /usr/include/bits/typesizes.h */
#define __TIME_T_TYPE __SLONGWORD_TYPE
#define __USECONDS_T_TYPE __U32_TYPE
#define __SUSECONDS_T_TYPE __SLONGWORD_TYPE
/* File: /usr/include/bits/types.h */
#define __S16_TYPE short int
#define __U16_TYPE unsigned short int
#define __S32_TYPE int
#define __U32_TYPE unsigned int
#define __SLONGWORD_TYPE long int
#define __ULONGWORD_TYPE unsigned long int
至此,可以确定,在64位系统下,time_t
类型也即是long int
类型
二、使用场景
time_t
类型的值如果想在printf
中打印,使用格式符PRId64
,该格式符定义包含在头文件inttypes.h
中。
#include <inttypes.h>
struct timeval current_time;
gettimeofday(¤t_time, NULL);
fprintf(stdout, "current time stamp: %" PRId64 "\n", current_time.tv_sec);