clock t實際型別的查詢流程

2021-07-09 13:50:51 字數 3636 閱讀 3756

把握clock_t 在系統中實際是什麼型別,有助於程式設計 人員更好的使用該型別的變數,最直接的好處就是可以防止變數溢位,在溢位時能夠準確判斷可能存在問題的**。現就將clock_t 的查詢過程做簡單記錄。

1)首先使用clock_t  型別變數需要包含標頭檔案,因此到該標頭檔案中查詢,而位於**,使用locate命令進行查詢。為什麼使用locate命令可以參考這篇blog:

通過locate命令查詢後可以發現僅在不同資料夾下就有多個,因此哪乙個是我們要查詢的,這涉及標頭檔案的查詢順序,可參考這篇blog:

根據以上blog中的內容,在編譯時未使用-i選項,c_include_path與cplus_include_path路徑為空,因此位於/usr/include中。終於確定了time.h 的位置。

2)在中直接查詢,clock_t,可以找到如下定義

#if !defined __clock_t_defined && (defined _time_h || defined __need_clock_t)

# define __clock_t_defined 1

# include __begin_namespace_std

/* returned by `clock'. */

typedef __clock_t clock_t;

__end_namespace_std

#if defined __use_xopen || defined __use_posix

__using_namespace_std(clock_t)

#endif

在檔案中無法找到__clock_t 的型別定義,不過發現包含。

3)

#include # define __std_type		typedef

__std_type __clock_t_type __clock_t; /* type of cpu usage counts. */

依然無法進一步找到__clock_t_type的型別,同時發現包含。

4)

/* see for the meaning of these macros.  this file exists so

that need not vary across different gnu platforms.  */

#define __clock_t_type __syscall_slong_type

再次查詢__syscall_slong_type的內容,可找到如下內容

#if defined __x86_64__ && defined __ilp32__

# define __syscall_slong_type __squad_type

# define __syscall_ulong_type __uquad_type

#else

# define __syscall_slong_type __slongword_type

# define __syscall_ulong_type __ulongword_type

#endif

由於我的機器是64位,因此__syscall_slong_type型別為__squad_type,到此查詢過程實際已進入死路,因為不再包含其他標頭檔案,不過根據注釋的內容,相同的巨集定義在中,因此回到。

5)

#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

#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

#include /* defines __*_t_type macros. */

好了結果出來了,__squad_type型別為long int,即clock_t經過多重巨集定義會被轉換為long int。在編譯時被包含的標頭檔案會在包含檔案中展開,__syscall_slong_type會被替換為long int,之後回溯的內容以此類推。

恩,恭喜你看到了這裡。其實要知道clock_t 型別遠不用這麼麻煩,可以在編譯時使用-e選項,-e選項的作用主要是對#include檔案進行展開,並將#define的內容進行替換。

寫乙個簡答的測試程式,#include都不要了,只要#include,測試程式如下:

#include int main()

執行以下命令:

gcc -e -o test_clock_t.i test_clock_t.c

typedef long int __clock_t;

typedef __clock_t clock_t;

int main()

通過實驗也可以發現,預編譯過程對typedef不起作用。

Git 在 實際開發 中的實際流程

master 通常只是用於對外發布專案的新版本 代替單一的 master,日常開發應該在另一條分支上完成,我們把開發用的分支叫做 develop 專案正式發布後難免會出現 bug,這時就需要建立乙個分支,進行 bug 的修補 hotfix 應該從 master 中分離出來,bug 被修補後,再合併到...

C 匿名型別的的實際應用

通過var和物件構造器,宣告乙個沒有名稱 其名稱是由編譯器分配的 的類,同時建立並初始化成員。如 var pc1 new 如果程式僅僅需要臨時一組資料,則用匿名型別比較合適,匿名型別編譯後,仍然是乙個普通的密封類,不可派生其他類,只是名稱是由編譯器分配的,利用物件構造器初始化的成員,具有唯讀屬性。匿...

java獲取泛型的實際型別

這是乙個困擾了我好久的問題,在我寫的android請求框架總結 二 中寫到過利用框架自動解析json資料,如下 object o if result.charat 0 else listener.success o 返回的物件也只能是object型別,具體用的時候還需要做一下強轉 其實當時有想過用泛...