這裡蒐索程式師資訊,查找有用的技術資料
當前位置:首頁 » 編程語言 » c語言條件編譯例子
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言條件編譯例子

發布時間: 2022-04-21 06:24:46

c語言中條件編譯預

既然知道是條件預編譯,那麼就不難理解了。C語言由源代碼生成的各階段如下:
C源程序->編譯預處理->編譯->優化程序->匯編程序->鏈接程序->可執行文件。
預處理指令先對以#號開頭的代碼(例如頭文件#include <stdio.h>、條件編譯指令#if/#ifdef等)進行處理,而不是在程序編譯執行時才處理的。也就是正常情況下#if t中的t應該是常量表達式,用於編譯預處理。而你程序中的t是在編譯後執行時,給t賦值,是無效的。
建議看下譚浩強的《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. 使用預處理功能便於程序的修改、閱讀、移植和調試,也便於實
現模塊化程序設計。

③ c語言程序設計 條件編譯

條件編譯
#if 條件表達式
語句一;
#else
語句二;
#endif
當 條件表達式 為真時,執行語句一,否則執行語句二。
很明顯你的語句中 LETTER 為 1,也就會執行
if(ch>='a' && ch<='z')
ch-=32;
而不會執行else 那部分了。

④ C語言條件編譯

#ifdef MAIN_REGS
#define _EXTERN //把_EXTERN定義為空,就是_EXTERN啥也不表示
#else
#define _EXTERN extern //把_EXTERN定義為extern
#endif

不定義MAIN_REGS的時候,_EXTERN被定義為關鍵字extern
下面程序就變成
extern volatile struct
{
enum _DispSt State;
u8 Time;}
sDisp;
extern 的定義,extern 表示一個聲明,定義在其他地方
所以編譯器認為你只是在聲明一個變數,如果你沒有額外在其他文件內定義sDisp
肯定是要報錯了
extern的含義請參考http://ke..com/link?url=9EVDWx7LdQeWITokvsRzSCc_ouvquAo-

⑤ C語言中條件編譯的實例

條件編譯命令最常見的形式為:
#ifdef 標識符
程序段1
#else
程序段2
#endif
它的作用是:當標識符已經被定義過(一般是用#define命令定義),則對程序段1進行編譯,否則編譯程序段2。
其中#else部分也可以沒有,即:
#ifdef
程序段1
#endif
這里的「程序段」可以是語句組,也可以是命令行。這種條件編譯可以提高C源程序的通用性。如果一個C源程序在不同計算機系統上系統上運行,而不同的計算機又有一定的差異。例如,我們有一個數據類型,在Windows平台中,應該使用long類型表示,而在其他平台應該使用float表示,這樣往往需要對源程序作必要的修改,這就降低了程序的通用性。

⑥ c語言中,什麼是條件編譯

一般情況下,源代碼文件中的所有行都參加編譯,但有時需要指定一部分代碼在某個條件下才被編譯,這就叫做條件編譯。

條件編譯發生在預處理階段,在C中,主要通過#if、#elif、#else、#ifdef、#ifndef、#endif來給一段代碼附加上編譯條件,然後預處理器收集滿足條件的可以進行編譯的代碼,這樣經過預處理,不滿足條件的代碼就不會被編譯。

再來說一下上面幾個預處理指令的用法:

#if條件1
語句塊1
#elif條件2
語句塊2
#else
語句塊3
#endif

可以看到,它和普通的條件結構語句很相似,就是滿足條件1就編譯語句塊1,否則如果滿足條件2就編譯語句塊2,否則編譯語句塊3。最後必須用#endif結尾。

#ifdef和#ifndef用法是:

#ifdef符號
語句塊
#endif

#ifndef符號
語句塊
#endif

ifdef意思是如果定義了指定的符號就編譯下面的語句塊;ifndef相反,如果沒定義指定的符號,就編譯下面的語句塊。

語句塊中也可以加預處理指令,這些預處理指令和其他語句一樣,只有當滿足條件時,才會被處理。

另外,ifndef常用於防止一個頭文件的重復引用。

更多,請參考網路:http://ke..com/link?url=-

⑦ 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語言中條件編譯

#define 1顯然是不行的。

你可以這么做:

#defineTEST1
#ifTEST
//test..
#else
//notest...
#endif

當判斷#if 後面的表達式為真時,執行#if後的語句,否則執行#else後的語句

擴展:通常我們可以用#if 0來注釋掉一個大的段落。

⑨ C語言宏定義 用條件編譯

條件編譯以及所有前面帶「#」的語句,是在編譯階段執行的語句,不會生成運行時的代碼。而你的y是在運行時才進行賦值的,所以是無法用條件編譯來實現的。
直接寫成條件語句就行:
{
if R
printf("%d是閏年\n",y);
else
printf("%d不是閏年\n",y);
}

⑩ c語言條件編譯

程序編譯沒有理解。

條件編譯是在編譯之前,利用 C 的預處理器完成的,也就是說,預處理器會將那些不滿足編譯條件的代碼忽略掉,不會提交給編譯器處理。因此,程序的代碼段要少,內存開銷也低。

條件執行,是運行是發生的。

建議自己查閱一下編譯原理這方的知識以及匯編的相關知識。