1. 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. 使用預處理功能便於程序的修改、閱讀、移植和調試,也便於實
現模塊化程序設計。
2. 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-
3. 關於C語言的條件編譯
作用一:編譯生成的可執行代碼或者只包含程序段1 或者只包含程序段2 ,可執行程序大小會變小;
作用二:可以靈活的通過宏定義標識符實現同一函數的不同版本,例如
#ifdef 標識符
func1(...) {...}
#else
func1(...) {...}
#endif
這樣func1函數通過宏定義可以有不同的實現
4. C語言中條件編譯
#define 1顯然是不行的。
你可以這么做:
#defineTEST1
#ifTEST
//test..
#else
//notest...
#endif
當判斷#if 後面的表達式為真時,執行#if後的語句,否則執行#else後的語句
擴展:通常我們可以用#if 0來注釋掉一個大的段落。
5. C語言中條件編譯和選擇結構的區別是什麼
條件編譯是有條件地編譯,就是不符合條件時,那代碼就不編譯,選擇結構就把所有的代碼都編譯!
6. C程序設計及條件編譯
首先我想說你好吝嗇,好歹給幾分嘛!,這題,好像在浩強哥的書里有吧 我在VC++6.0中能通過編譯, 代碼如下:#include"stdio.h"
#define MAX 80
#define CHANGE 1
void main()
{
char str[MAX];
int i;
printf("input text:\n");
gets(str);
#if (CHANGE)
{for (i=0;i<MAX;i++)
{if (str[i]!='\0')
if(str[i]>'a'&&str[i]<'z'||str[i]>='A'&&str[i]<='Z')
str[i]+=1;
else if(str[i]=='z'||str[i]=='Z')
str[i]-=25;
}
}
#endif
printf("output:\n%s\n",str);
}
7. 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
8. c中條件編譯的問題
嘿嘿!你的錯誤應該是這個constant expression require!
簡單一點對你說,#if後面不可以接變數表達式!
因為條件編譯就是根據你不同的條件來編譯你程序中的不同部分!
所謂條件是指需要在計算機編譯時確定的,但你一定有聽老師講過變數表達式
只是在程序執行時充當作用!
如果你將AMD改為常量表達式!程序一定沒有錯!
9. C語言 條件編譯問題
#include <stdio.h>
#include <stdlib.h>
#define CHANGE 0 //1表示翻譯,0表示不翻譯
int main(void)
{
char a[100];
int i;
char c;
printf("Please input the string\n");
for (i = 0; i < 100; i++)
{
scanf("%c", &a[i]);
if (a[i]== '\n')
{
a[i] = '\0';
break;
}
}
for (i = 0; i < 100;a[i] = c,i++)
{
#ifdef CHANGE 1
{
if(a[i]!= '\0')
{
c = a[i];
if (c == 'z')
{
c = 'a';
continue;
}
c = c -32;
}
else break;//你要加上跳出語句
}
//#else{};
#endif
}
printf("\n");
for (i = 0; i < 100; i++)
{
if (a[i]== '\0')
break;
printf("%c", a[i]);
}
system("pause");
return 0;
}
你調試看一下,當a[i]=='\0'的時候它i仍然在自加,根本就沒有跳出循環,所以後面出現的是亂碼,所以你要加上個break跳出語句!還有你的那個小寫轉換為大寫的時候不對,應該是減去32,大寫轉換為小寫的時候是加上32,理解了的話,別忘了加分哦!祝你好運!
10. C語言中條件編譯的實例
條件編譯命令最常見的形式為:
#ifdef 標識符
程序段1
#else
程序段2
#endif
它的作用是:當標識符已經被定義過(一般是用#define命令定義),則對程序段1進行編譯,否則編譯程序段2。
其中#else部分也可以沒有,即:
#ifdef
程序段1
#endif
這里的「程序段」可以是語句組,也可以是命令行。這種條件編譯可以提高C源程序的通用性。如果一個C源程序在不同計算機系統上系統上運行,而不同的計算機又有一定的差異。例如,我們有一個數據類型,在Windows平台中,應該使用long類型表示,而在其他平台應該使用float表示,這樣往往需要對源程序作必要的修改,這就降低了程序的通用性。