一、
define巨集定義表示式
1、巨集函式被呼叫時是以實參代替形參,而不是「值傳遞」
#define sum(x) (x)+(x)
如果x的值為5*3,而**又寫成sum(x)*sum(x),則替換後變成(5*3)+(5*3)*(5*3)+(5*3),顯然錯了!所以最外層的括號最好別省略,應定義為#define sum(x) ((x)+(x))
二、
條件編譯
1、第一種形式
#ifdef 識別符號
程式段1
#else
程式段2
#endif
2、第二種形式
#ifndef 識別符號
程式段1
#else
程式段2
#endif
3、第三種形式
#if 常量表示式
程式段1
#else
程式段2
#endif
三、
#pragma預處理
#pragma預處理指令非常多,這裡重點討論記憶體對齊問題和#pragma pack()的使用方法。
1、記憶體對齊:是作業系統為了快速訪問記憶體的一種策略,如果沒有記憶體對齊,可能在訪問某個變數時需要兩次記憶體訪問。例如:假設沒有記憶體對齊:
作業系統先讀取0xffbff5e8-0xffbff5ef的記憶體,然後在讀取0xffbff5f0-0xffbff5f8的記憶體,為了獲得值c,就需要將兩組記憶體合併,進行整合,這樣嚴重降低了記憶體的訪問效率。
詳細出處參考:
2、所以要求資料型別的首位址是k(k通常為4或者8)的倍數,這就是記憶體對齊。當然,不同編譯器的k值是不同的。
3、例子:
sizeof(xx)為16
sizeof(xx)為12。(注:a的大小為4個位元組,所以只能儲存在為4的整數倍的位址上)
4、避免記憶體對齊的影響則可以利用#pragma()來改變編譯器的預設對齊方式
#pragma(n)//編譯器將按照n位元組對齊
#pragma() //編譯器將取消自定義位元組對齊方式
C語言預處理
c語言中編譯預處理的三種形式的命令 巨集定義,檔案包含,條件編譯命令。1 巨集定義主要是 define,undef 如下 define pi 3.1415926 不帶引數的巨集定義 define max a,b a b?a b 帶引數的巨集定義 說明 巨集定義在c語言與c 語言中是相通的。下面舉例說...
C語言預處理
預處理 系統自動自動呼叫預處理程式對程式中 號開頭的預處理部分進行處理,處理完畢後可以進城源程式的編譯階段。預定義 一些預定義符號 常用於除錯 file 正在預編譯的源檔名 line 當前行號 只有這個是整數常量,其他是字串常量 function 當前所在函式名 date 當前日期 time 當前時...
c語言預處理
預處理可以包含 1 巨集定義指令 2 標頭檔案包括指令 3 條件編譯指令 4 編譯程式可以識別的特殊符號 巨集定義 define undef 檔案包含 include 條件編譯 if ifdef else elif endif等 其他 line error program等 注意事項 1 在c語言中...