C語言的編譯預處理
阿新 • • 發佈:2018-09-10
wall shadow c程序 方式 共享庫 blog gcc編譯 程序員 proc 1、C程序的過程
#error編譯指示字用於自定義程序員特有的編譯錯誤消息類似的,#warning用於生成編譯警告,但不會停止編譯
#line用於強制指定新的行號和編譯文件名,並對源程序的代碼重新編號
用法: #line number filename (filename可省略)
#line編譯指示字的本質是重定義__LINE__和__FILE__
#pragma預處理:
#pragma GCC dependency 文件名 (已使用版本控制代替)
把當前文件和指定文件之間建立依賴關系,如果當前文件最後修改時間比指定文件新,就沒問題,否則就產生警告
#pragma GCC poison 標識符或關鍵字
把後面的標識符或關鍵字禁止使用
#pragma pack(數字)
針對結構體的對齊補齊
處理流程:
靜態鏈接與動態鏈接:
鏈接可以分為靜態鏈接(靜態庫)與動態鏈接(共享庫):
?靜態庫是代碼的歸檔,在使用靜態庫時是采用的復制代碼的方式。共享庫是可執行文件的組成部分,在使用共享庫時是采用的提供代碼在共享庫的地址給可執行文件的方式。
GCC編譯器:區分大小寫
gcc -E : 只做預處理,其它都不做,(.i) gcc -S : 檢查語法錯誤等,生成匯編文件(.s) gcc -c : 完成匯編,不鏈接(.o) gcc -o : 修改目標文件名 gcc : 編譯+鏈接,生成可執行文件,默認是 a.out gcc -Wall : 生成所有的警告信息(提示代碼質量,少警告) Gcc -D宏名: 條件編譯,用於版本選項開關
包含頭文件的方法:
宏定義與使用分析:
內置宏:
條件編譯使用:
條件編譯使得我們可以按不同的條件編譯不同的代碼段,因而可以產生不同的目標代碼
#if…#else…#endif被預編譯器處理;而if…else語句被編譯器處理,必然被編譯進目標代碼
實際工程中條件編譯主要用於一下兩種情況:
不同的產品線共用一份代碼;區分編譯產品的調試版和發布版
#error(#warning)和#line :
#error用於生成一個編譯錯誤消息,並停止編譯
用法: #error message (message不需要用雙引號包圍)
#line用於強制指定新的行號和編譯文件名,並對源程序的代碼重新編號
用法: #line number filename (filename可省略)
#line編譯指示字的本質是重定義__LINE__和__FILE__
#pragma預處理:
#pragma GCC dependency 文件名 (已使用版本控制代替)
把當前文件和指定文件之間建立依賴關系,如果當前文件最後修改時間比指定文件新,就沒問題,否則就產生警告
把後面的標識符或關鍵字禁止使用
#pragma pack(數字)
針對結構體的對齊補齊
Struct占用內存大小分析:
第一個成員起始於0偏移處
每個成員按其類型大小和指定對齊參數n中較小的一個進行對齊
偏移地址和成員占用大小均需對齊
結構體成員的對齊參數為其所有成員使用的對齊參數的最大值結構體總長度必須為所有對齊參數的整數倍
#和##運算符使用:
C語言的編譯預處理