我的位置: 首頁 > 學習專區 > .NET技術 > C語言條件編譯詳解

C語言條件編譯詳解

2013-04-17 13:43:01
來源:
[導讀] 它的功能是,如果標識符已被 define命令定義過則對程序段1進行編譯;否則對程序段2進行編譯。如果沒有程序段2(它為空),本格式中的 else
預處理程序提供了條件編譯的功能。可以按不同的條件去編譯不同的程序部分,因而產生不同的目標代碼文件。這對于程序的移植和調試是很有用的。條件編譯有三種形式,下面分別介紹:
 
一、第一種形式:
 #ifdef  標識符
   程序段1
 #else
   程序段2
 #endif
 

本文來自【C語言中文網】:http://see.xidian.edu.cn/cpp/html/68.html
它的功能是,如果標識符已被 #define命令定義過則對程序段1進行編譯;否則對程序段2進行編譯。如果沒有程序段2(它為空),本格式中的#else可以沒有,即可以寫為:
    #ifdef  標識符
 程序段
     #endif
 
【例9.12】
 #define NUM ok
 main(){
   struct stu
   {
     int num;
     char *name;
     char sex;
     float score;
   }  *ps;
   ps=(struct stu*)malloc(sizeof(struct stu));
   ps->num=102;
   ps->name="Zhang ping";
   ps->sex='M';
   ps->score=62.5;
   #ifdef NUM
   printf("Number=%d\nScore=%f\n",ps->num,ps->score);
   #else
   printf("Name=%s\nSex=%c\n",ps->name,ps->sex);
   #endif
   free(ps);
 }
 
由于在程序的第16行插入了條件編譯預處理命令,因此要根據NUM是否被定義過來決定編譯那一個printf語句。而在程序的第一行已對NUM作過宏定義,因此應對第一個printf語句作編譯故運行結果是輸出了學號和成績。
 
在程序的第一行宏定義中,定義NUM表示字符串OK,其實也可以為任何字符串,甚至不給出任何字符串,寫為:
     #define NUM
 也具有同樣的意義。只有取消程序的第一行才會去編譯第二個printf語句。讀者可上機試作。
 
二、第二種形式:
     #ifndef 標識符 
 程序段1 
     #else 
            程序段2 
     #endif
 與第一種形式的區別是將“ifdef”改為“ifndef”。它的功能是,如果標識符未被#define命令定義過則對程序段1進行編譯,否則對程序段2進行編譯。這與第一種形式的功能正相反。
 
三、第三種形式:
   #if 常量表達式
            程序段1
  #else 
            程序段2
         #endif
 它的功能是,如常量表達式的值為真(非0),則對程序段1 進行編譯,否則對程序段2進行編譯。因此可以使程序在不同條件下,完成不同的功能。
 
【例9.13】
 #define R 1
 main(){
   float c,r,s;
   printf ("input a number:  ");
   scanf("%f",&c);
   #if R
     r=3.14159*c*c;
     printf("area of round is: %f\n",r);
   #else
     s=c*c;
 printf("area of square is: %f\n",s);
 #endif
 }
 
本例中采用了第三種形式的條件編譯。在程序第一行宏定義中,定義R為1,因此在條件編譯時,常量表達式的值為真,故計算并輸出圓面積。
 
上面介紹的條件編譯當然也可以用條件語句來實現。 但是用條件語句將會對整個源程序進行編譯,生成的目標代碼程序很長,而采用條件編譯,則根據條件只編譯其中的程序段1或程序段2,生成的目標程序較短。如果條件選擇的程序段很長,采用條件編譯的方法是十分必要的。

深圳北大青鳥嘉華校區
評論
熱點專題
>>
相關文章推薦
>>
好吊妞免费视频在线观看,久久亚洲国产人成综合网,久久精品国产2020,欧美精品综合在线
五月丁香六月婷婷网线视频 | 九九国产精品视频 | 日韩在线不卡免费视频 | 日本一道综在合线 | 亚洲国产精品自在在线观看 | 久久久这里全部是精品 |