C語言中條件編譯的作用
條件編譯屬于三種宏定義中的一種,條件指示符的最主要目的是防止頭文件的重復包含和編譯,例如:一個c文件包含同一個h文件多次,如果不加#ifndef宏定義,會出現變量重復定義的錯誤
條件編譯常用的有四個預處理命令:#if、#else、#elif、#endif。
#if指令的形式為:
#if 常量表達式
代碼塊
#endif#if后面的常量表達式為值,則編譯它與#endif之間的代碼,否則跳過這些代碼。指令#endif標識一個#if塊的結束。
#else被使用來標志#if的末尾和#else塊的開始。這是必須的,因為任何#if僅有一個#endif與之關聯。
#elif意指"else if",它形成一個if else if嵌套語句用于多種編譯選擇。#elif后面跟一個常量表達式,如果表達式是真,則編譯其后的代碼塊,不對其他#elif表達式進行檢測,否則順序測試下一塊。常見的形式如下:
形式1:
#ifdef 標識符
/*程序段 1*/
#else
/*程序段 2*/
#endif它的作用是當標識符已經由#define定義過了,則編譯程序段1,否則編譯程序段2,也可以使用簡單形式
#ifdef 標識符
/*程序段1*/
#endif
形式2:
#ifndef 標識符
#define 標識符
/*程序段 1*/
#else
/*程序段 2*/
#endif 它的作用是當標識符沒有由#define定義過,則編譯程序段1,否則編譯程序段2 ,也可以使用簡單形式
#ifndef 標識符
#define 標識符
/*程序段 1*/
# endif形式3:
#if 表達式
/*程序段 1*/
#else
*程序段 2*/
# endif 它的作用是 當“表達式”值為真時編譯程序段1。否則則編譯程序段2,也可以使用簡單形式
# if 表達式
/*程序段 1*/
# endif形式4:
#if 表達式1
/*程序段 1*/
#elif 表達式2
/*程序段 2*/
#elif 表達式n
/*程序段n */
#endif 它的作用是當“表達式1”值為1時編譯程序段1,表達式2的值為真是編譯程序段2,否則依次順序判斷到表達式n。
最后,條件編譯的條件是一個常量表達式,支持邏輯與&&和或||運算。以上四種形式的條件編譯預處理結構都可以嵌套使用,
標識符: 在理論上來說可以是自由命名的,但每個頭文件的這個標識符都應該是唯一的。標識的命名規則一般是頭文件名全大寫,前后加下劃線,并把文件名中的“.”也變成下劃線,如:stdio.h。
#ifndef _STDIO_H_
#define _STDIO_H_
/*程序段 */
#endif
c語言中,什么是條件編譯
條件編譯屬于三種宏定義中的一種,條件指示符的最主要目的是防止頭文件的重復包含和編譯,例如:一個c文件包含同一個h文件多次,如果不加#ifndef宏定義,會出現變量重復定義的錯誤條件編譯常用的有四個預處理命令:#if、#else、#elif、#endif。
#if指令的形式為:#if 常量表達式代碼塊#endif#if后面的常量表達式為值,則編譯它與#endif之間的代碼,否則跳過這些代碼。指令#endif標識一個#if塊的結束。
#else被使用來標志#if的末尾和#else塊的開始。這是必須的,因為任何#if僅有一個#endif與之關聯。
#elif意指"else if",它形成一個if else if嵌套語句用于多種編譯選擇。#elif后面跟一個常量表達式,如果表達式是真,則編譯其后的代碼塊,不對其他#elif表達式進行檢測,否則順序測試下一塊。
常見的形式如下:形式1: #ifdef 標識符 /*程序段 1*/ #else /*程序段 2*/ #endif它的作用是當標識符已經由#define定義過了,則編譯程序段1,否則編譯程序段2,也可以使用簡單形式 #ifdef 標識符 /*程序段1*/ #endif 形式2: #ifndef 標識符 #define 標識符 /*程序段 1*/ #else /*程序段 2*/ #endif 它的作用是當標識符沒有由#define定義過,則編譯程序段1,否則編譯程序段2 ,也可以使用簡單形式 #ifndef 標識符 #define 標識符 /*程序段 1*/ # endif形式3: #if 表達式 /*程序段 1*/ #else *程序段 2*/ # endif 它的作用是 當“表達式”值為真時編譯程序段1。否則則編譯程序段2,也可以使用簡單形式 # if 表達式 /*程序段 1*/ # endif形式4: #if 表達式1 /*程序段 1*/ #elif 表達式2 /*程序段 2*/ 。
。 #elif 表達式n /*程序段n */ #endif 它的作用是當“表達式1”值為1時編譯程序段1,表達式2的值為真是編譯程序段2,否則依次順序判斷到表達式n。
最后,條件編譯的條件是一個常量表達式,支持邏輯與&&和或||運算。以上四種形式的條件編譯預處理結構都可以嵌套使用,標識符: 在理論上來說可以是自由命名的,但每個頭文件的這個標識符都應該是唯一的。
標識的命名規則一般是頭文件名全大寫,前后加下劃線,并把文件名中的“.”也變成下劃線,如:stdio.h。#ifndef _STDIO_H_#define _STDIO_H_/*程序段 */#endif。
C語言中條件編譯的實例
條件編譯命令最常見的形式為:
#ifdef 標識符
程序段1
#else
程序段2
#endif
它的作用是:當標識符已經被定義過(一般是用#define命令定義),則對程序段1進行編譯,否則編譯程序段2。
其中#else部分也可以沒有,即:
#ifdef
程序段1
#endif
這里的“程序段”可以是語句組,也可以是命令行。這種條件編譯可以提高C源程序的通用性。如果一個C源程序在不同計算機系統上系統上運行,而不同的計算機又有一定的差異。例如,我們有一個數據類型,在Windows平臺中,應該使用long類型表示,而在其他平臺應該使用float表示,這樣往往需要對源程序作必要的修改,這就降低了程序的通用性。
條件語句課后練習題-一道C語言練習題利用條件編譯實現:如果輸入
#include void main() { int a,b,c,e; printf("你要輸入幾個數字:"); scanf("%d",&a); if(a==2) { printf("輸入兩個數字:"); scanf("%d%d",&b,&c); e=b;b=c;c=e; } else if(a==3) { printf("輸入三個數字:"); scanf("%d%d%d",&b,&c,&e); if(b>c&&c>e) printf("%d%d",b,c); if(b>e&&e>c) printf("%d%d",b,e); if(e>c&&c>b) printf("%d%d",e,c); } }。
C語言中條件編譯和If語句之間的差別,各適用于什么情況
條件編譯是C語言中預處理部分的內容,它是編譯器編譯代碼時最先處理的部分,
條件編譯里面有判斷語句,比如 #if 、#else 、#elif 及 #endif
它的意思是如果宏條件符合,編譯器就編譯這段代碼,否則,編譯器就忽略這段代碼而不編譯,如
#define A 0 //把A定義為0
#if (A > 1)
printf("A > 1"); //編譯器沒有編譯該語句,該語句不生成匯編代碼
#elif (A == 1)
printf("A == 1"); //編譯器沒有編譯該語句,該語句不生成匯編代碼
#else
printf("A 1)
printf("A > 1"); //編譯器編譯該語句,但因為A == 0 未執行
else if(A == 1)
printf("A == 1"); //編譯器編譯該語句,但因為A == 0 未執行
else
printf("A
C++ if()是不是條件編譯指令
if()屬于判斷語句,不是條件編譯指令。
與if類似的條件編譯指令為#if和#ifdef。
條件編譯指令屬于預編譯語句,即編譯器在執行編譯工作時,會第一步處理預編譯語句,之后再進行剩余的編譯工作。
在C語言中,所有的預編譯語句都是以#開頭的,如#define, #undef,#if等等。
條件編譯指令包括以下幾項:
1 #if
當后續的參數為真時執行編譯。
2 #ifdef/#ifndef
#ifdef當后續的宏定義被定義時執行編譯。
#ifndef當后續的宏定義沒有被定義時執行編譯。
3 #elif
與C語言語句中的else if類似,與#if或#ifdef連用,當后續參數為真時執行編譯。
4 #endif
用于條件編譯結尾,表示條件編譯結束。
C語言中的條件編譯有什么作用
條件編譯就是為了實現在滿足一定條件時編譯某一組語句,而再不滿足條件時編譯另一組語句!事實上,它確實與條件語句相似,但是它們是不一樣的。
條件語句中的各個語句都是要經過編譯的,而條件編譯中的部分語句不需要進行編譯(請注意這兒是編譯不是執行)。條件編譯的作用在編寫大型程序的時候就會相當的明顯,因為它可以減少被編譯的語句,從而減少目標程序的長度,減少運行時間。
具體怎樣使用的話,這個你最好看一些教程,要想在這個地方給你講清還是比較麻煩的。不過總體來講它還是比較簡單的,你看教程的話應該比較容易看懂!。
C語言中條件編譯有哪幾種形式
預處理程序提供了條件編譯的功能。
可以按不同的條件去編譯 不同的程序部分,因而產生不同的目標代碼文件。 這對于程序的移 植和調試是很有用的。
條件編譯有三種形式,下面分別介紹: 1. 第一種形式: #ifdef 標識符 程序段1 #else 程序段2 #endif 它的功能是,如果標識符已被 #define命令定義過則對程序段1 進行編譯;否則對程序段2進行編譯。 如果沒有程序段2(它為空),本格式中的#else可以沒有, 即可 以寫為: #ifdef 標識符 程序段 #endif #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語句。讀者可上機試作。
2. 第二種形式: #ifndef 標識符 程序段1 #else 程序段2 #endif 與第一種形式的區別是將“ifdef”改為“ifndef”。它的功能 是,如果標識符未被#define命令定義過則對程序段1進行編譯, 否 則對程序段2進行編譯。
這與第一種形式的功能正相反。 3. 第三種形式: #if 常量表達式 程序段1 #else 程序段2 #endif 它的功能是,如常量表達式的值為真(非0),則對程序段1 進行 編譯,否則對程序段2進行編譯。
因此可以使程序在不同條件下,完 成不同的功能。 #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, 生成 的目標程序較短。如果條件選擇的程序段很長, 采用條件編譯的方 法是十分必要的。
☆本章小結☆ 1. 預處理功能是C語言特有的功能,它是在對源程序正式編譯前由 預處理程序完成的。程序員在程序中用預處理命令來調用這些功 能。
2. 宏定義是用一個標識符來表示一個字符串,這個字符串可以是常 量、變量或表達式。在宏調用中將用該字符串代換宏名。
3. 宏定義可以帶有參數,宏調用時是以實參代換形參。而不是“值 傳送”。
4. 為了避免宏代換時發生錯誤,宏定義中的字符串應加括號,字符 串中出現的形式參數兩邊也應加括號。 5. 文件包含是預處理的一個重要功能,它可用來把多個源文件連接 成一個源文件進行編譯,結果將生成一個目標文件。
6. 條件編譯允許只編譯源程序中滿足條件的程序段,使生成的目標 程序較短,從而減少了內存的開銷并提高了程序的效率。 7. 使用預處理功能便于程序的修改、閱讀、移植和調試,也便于實 現模塊化程序設計。