【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(&current_time, NULL);
fprintf(stdout, "current time stamp: %" PRId64 "\n", current_time.tv_sec);
posted @ 2023-06-29 11:46  coffee_tea_or_me  阅读(98)  评论(0编辑  收藏  举报