C語言筆記 預處理

2021-06-22 01:58:24 字數 1966 閱讀 4536

一、

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語言中...