免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
關(guān)于C語言中的預(yù)處理器的簡單筆記

    在將源代碼提交給編譯器之前,C語言預(yù)處理器將對(duì)源代碼做出一定修正。預(yù)處理器命令有很多如最常用的#include,#define命令.

預(yù)處理命令都是以#開頭,一般放在代碼的最左側(cè),通常定義的宏全部都是用大寫。

條件編譯

下面這一系列的指令都可以用來決定代碼的哪個(gè)部分應(yīng)該被編譯,這些指令包括:#if,#elif,#else,#ifdef,#else,#ifdef以及#ifndef。以#if開頭的語句塊必須以#endif結(jié)尾。

可以使用條件編譯來注釋代碼,例如


  1. #if 0 
  2.  
  3. /* comment ... 
  4.  
  5. */ 
  6.  
  7.   
  8.  
  9. // code 
  10.  
  11.   
  12.  
  13. /* comment */ 
  14.  
  15. #endif 

#if 表達(dá)式,如果表達(dá)式為假,那么這部分代碼就不會(huì)被編譯,為真才參與編譯。雖然你會(huì)說使用塊注釋也是可行的,但是可惜的是塊注視不支持嵌套,在某些環(huán)境下選擇#if 0確實(shí)是一個(gè)更好的選擇。測試代碼:

 

  1. #include<stdio.h> 
  2.  
  3. int main() 
  4.  
  5.  
  6. #if 0 
  7.  
  8.       int a=10; 
  9.  
  10. #endif 
  11.  
  12.   
  13.  
  14. #if 1 
  15.  
  16.       int a=11; 
  17.  
  18. #endif 
  19.  
  20.       printf("a=%d\n",a); 
  21.  

可以好似用#ifndef來避免頭文件被重復(fù)編譯:例如下面這段代碼:


  1. #ifndef _FILE_NAME_H_ 
  2. #define _FILE_NAME_H_ 
  3.   
  4. /* code */ 
  5.   
  6. #endif // #ifndef _FILE_NAME_H_ 

同樣的技術(shù)可以用來定義一些常量,如:


  1. #ifndef NULL 
  2. #define NULL (void *)0 
  3. #endif // #ifndef NULL 

 

宏定義

使用簡單的宏就不多說了,對(duì)于比較復(fù)雜的宏,常見的是使用類似于函數(shù)定義的宏,使用這種宏要特別注意宏的副作用。例如下面這段代碼:

#define MULT(x, y) x * y
int z = MULT(3 + 2, 4 + 2);

一般情況,要對(duì)所有的實(shí)參添加括號(hào),同時(shí)對(duì)宏體整體添加括號(hào)。

下面考察一種更加復(fù)雜的情況,交換兩個(gè)數(shù)的宏定義可以寫為:


  1. #define SWAP(a, b)  a ^= b; b ^= a; a ^= b;  
  2. int x = 10; 
  3. int y = 5; 
  4.   
  5. // works OK 
  6. SWAP(x, y); 
  7.   
  8. // What happens now? 
  9. if(x < 0) 
  10.     SWAP(x, y); 
 

對(duì)于第if語句會(huì)出現(xiàn)邏輯錯(cuò)誤,因?yàn)檫@個(gè)if語句只執(zhí)行第一個(gè)異或操作。嗯,或許你已經(jīng)想到了,加上大括號(hào),像下面這樣:


  1. #define SWAP(a, b)  {a ^= b; b ^= a; a ^= b;}  

然而,還是對(duì)于第二個(gè)if語句還是不正確,因?yàn)轭A(yù)處理器替換之后就出現(xiàn)了‘};’語法錯(cuò)誤。這里有一個(gè)技巧,正確的寫法如下:


  1. #define SWAP(a, b)  do { a ^= b; b ^= a; a ^= b; } while ( 0 ) 

這下就可以了,這里沒有給實(shí)參加括號(hào)的原因是因?yàn)槲覀冎皇轻槍?duì)變量的交換,不考慮那些表達(dá)式交換。

 

使用\分割宏體

 

如果宏體比較復(fù)雜的話,我們就需要使用\來分割宏體,示例代碼如下所示:


  1. #define SWAP(a, b)  {                   \ 
  2.                         a ^= b;         \ 
  3.                         b ^= a;         \  
  4.                         a ^= b;         \ 
  5.                     }  

 

表達(dá)式合并

有時(shí)候在宏體中我們需要連接兩個(gè)參數(shù)的名字這時(shí)候可以使用##


  1. struct command 
  2. char *name; 
  3. void (*function) (); 
  4. }; 
  5. struct command commands[] = 
  6. "quit", quit_command}, 
  7. "help", help_command}, 
  8. {"run",run_help}, 
  9. {"open",open_help} 
  10. }; 

struct中顯然每個(gè)名字都重復(fù)了一遍,通過使用##可以減少重復(fù),方便維護(hù):


  1. #define COMMAND(NAME) { #NAME, NAME ## _command } 
  2. struct command commands[] = 
  3. COMMAND (quit), 
  4. COMMAND (help), 
  5. COMMAND (run), 
  6. COMMAND (open) 
  7. }; 

符號(hào)字符串化

有時(shí)候我們經(jīng)常需要將傳入到宏中的符號(hào)或者叫做參數(shù)轉(zhuǎn)換為文本形式,這樣對(duì)于打印這些符號(hào)的時(shí)候比較方便,在寫一些調(diào)試模塊的時(shí)候,經(jīng)常會(huì)遇到這樣的需求,實(shí)現(xiàn)這個(gè)過程的語法很簡單,只需要在符號(hào)前面添加一個(gè)‘#’就可以了。例如下面這段代碼:


  1. #define PRINT_TOKEN(token) printf(#token " is %d", token) 
  2. PRINT_TOKEN(foo); 

PRINT_TOKEN(foo);將被擴(kuò)展 printf("<foo>" " is %d" <foo>)

新版本的C語言支持將多個(gè)使用雙引號(hào)括起來的字符串練成一個(gè)整體的字符串。

下面為測試代碼:

 

  1. #include<stdio.h> 
  2.  
  3. #define PRINT_TOKEN(token) printf(#token " is %d\n",token); 
  4.  
  5. int main() 
  6.  
  7.  
  8.       int x=10,y=20; 
  9.  
  10.       PRINT_TOKEN(x+y); 
  11.  
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C語言宏
C/C++指令 #undef ,#ifdef, #ifndef,#if的用法
C語言中的預(yù)處理基本知識(shí)
likely,unlikely宏與GCC內(nèi)建函數(shù)__builtin_expect()
【條件編譯】一份代碼適配多種機(jī)型,就要用這個(gè)關(guān)鍵詞
C宏——智者的利刃,愚者的惡夢!
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服