宏定義條件編譯
我覺得你可能是少打了一些字母 完整的程序如下 在我的編譯器上試過 三個都是一樣的
#include<stdio.h>
#define LETTER 1
void main()
{
char str[20]="C Language",c;
int i=0;
while((c=str[i])!='\0')
{
i++;
#ifndef LETTER
if(c>='a'&&c<='z')
c=c+32;
#else
if(c>='a'&&c<='z') //此處少了一個if
c=c-32;
#endif
printf("%c",c);
}
printf("\n");
}
#include<stdio.h>
#define LETTER 1
void main()
{
char str[20]="C Language",c;
int i=0;
while((c=str[i])!='\0')
{
i++;
#ifdef LETTER //你在此處打的是if,此處打錯了
if(c>='a'&&c<='z')
c=c-32;
#else
if(c>='a'&&c<='z')
c=c+32;
#endif
printf("%c",c);
}
printf("\n");
}
#include<stdio.h>
#define LETTER 1
void main()
{
char str[20]="C Language",c;
int i=0;
while((c=str[i])!='\0')
{
i++;
#ifdef LETTER
if(c>='a'&&c<='z')
c=c-32;
#else
if(c>='a'&&c<='z') //此處少了一個if
c=c+32;
#endif
printf("%c",c);
}
printf("\n");
}
② 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
BZ
編譯的時候,就會編譯「程序1」,而不編譯「程序2」;
如果前面,以及include的文件裡面都沒有BZ的定義,編譯時,就不會編譯「程序1」,而是編譯「程序2」
if
else
就錯了。
#ifdef
BZ,僅僅是說BZ已經定義,與其值沒有任何關系,你讓他=0,=別的什麼,不會影響#ifdef的行為。
條件編譯是編譯時的選項,與運行時無關,你不能在運行時做什麼選擇。
從if語句看,你的條件是a=1,不是BZ是否定義。
④ 什麼是宏定義
宏定義是高級語言編譯器提供的常用語法,其目的是利用某一標識符標識某個文本字元串。在編寫程序時,如果程序中反復地使用某個數據或某段程序片段,就可以考慮將這個數據或程序片段定義為宏,然後每個出現該數據或程序片段的地方用宏名替代
選擇宏定義來做的好處是程序簡潔,可讀性好,而且當需要修改這些相同的程序片段時,只要修改宏定義中的字元串即可,不需要修改多處。
(4)宏定義條件編譯擴展閱讀:
參宏定義中#的用法:
#defineSTR(str) #str
#用於把宏定義中的參數兩端加上字元串的""
比如,這里STR(my#name)會被替換成"my#name",一般由任意字元都可以做形參,但以下情況會出錯:
STR())這樣,編譯器不會把")"當成STR()的參數。STR(,)同上,編譯器不會把","當成STR的參數。STR(A,B)如果實參過多,則編譯器會把多餘的參數捨去。
(VC++2008為例)STR((A,B))會被解讀為實參為:(A,B),而不是被解讀為兩個實參,第一個是(A第二個是B)。
⑤ 宏定義裡面不能再包含條件編譯語句嗎
不可以
宏定義要求必須寫在一行
而條件編譯必須是獨立一行。
這兩個本身就是矛盾的
要條件編譯加宏定義, 只能是條件編譯在外層,宏定義在內層
比如
#include<stdio.h>
#ifdefTEST
#defineVALUE0
#else
#defineVALUE1
#endif
intmain()
{
printf("%d ",VALUE);
}
⑥ 條件編譯,該怎麼處理
條件編譯屬於三種宏定義中的一種,條件指示符的最主要目的是防止頭文件的重復包含和編譯,例如:一個c文件包含同一個h文件多次,如果不加#ifndef宏定義,會出現變數重復定義的錯誤
條件編譯常用的有四個預處理命令:#if、#else、#elif、#endif。
#if指令的形式為:
#if 常量表達式
代碼塊
#endif
#if後面的常量表達式為值,則編譯它與#endif之間的代碼,否則跳過這些代碼。指令#endif標識一個#if塊的結束。
⑦ C語言宏定義條件編譯問題2
#define DEBUG 最後成功時把這句刪除就行了......#ifdef DEBUG //這里你就不用刪除了,因為沒了DEBUG的定義,
printf("x=%d,y=%d,z=%d\n",x,y,z); 這里的代碼也就不執行了,
#endif當程序很大時,你就不用從頭到尾的刪除調試用的代碼了.只要刪除DEBUG的定義,就完事了.這就是它的用處,與編譯器的DEBUG和Release方式是沒有關系的.
⑧ 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語言源程序中,允許用一個標識符來表示一個字元串,稱為宏,宏定義是由源程序中的宏定義命令完成的,宏替換是由預處理程序自動完成的。宏定義是C提供的三種預處理功能的其中一種,這三種預處理包括:宏定義、文件包含、條件編譯。
(9)宏定義條件編譯擴展閱讀:
宏(Macro),是一種批量處理的稱謂。計算機科學里的宏是一種抽象,它根據一系列預定義的規則替換一定的文本模式。
計算機語言如C語言或匯編語言有簡單的宏系統,由編譯器或匯編器的預處理器實現。C語言的宏預處理器的工作只是簡單的文本搜索和替換,使用附加的文本處理語言如M4,C程序員可以獲得更精巧的宏。
⑩ C語言宏定義 用條件編譯
條件
編譯以及所有前面帶「#」的語句,是在編譯
階段
執行的語句,不會生成
運行時
的
代碼
。而你的y是在運行時才進行賦值的,所以是無法用條件編譯來實現的。
直接寫成條件語句就行:
{
if
R
printf("%d是閏年\n",y);
else
printf("%d不是閏年\n",y);
}