C語言中巨集名是否必須用大寫字母表示?舉個例子

2022-03-07 18:51:42 字數 5579 閱讀 9992

1樓:天寂無痕

c語言中巨集名不是必須用大寫字母表示,習慣上巨集名用大寫字母表示,以便於與變數區別。但也允許用小寫字母。

巨集定義表示資料型別,使書寫方便。例如: #define stu struct stu在程式中可用stu作變數說明:

stu body[5],*p;#define integer int。

在程式中即可用integer作整型變數說明: integer a,b;

應注意用巨集定義表示資料型別和用typedef定義資料說明符的區別。

巨集定義只是簡單的字串代換,是在預處理完成的,而typedef是在編譯時處理的,它不是做簡單的代換, 而是對型別說明符重新命名。被命名的識別符號具有型別定義說明的功能。

2樓:八哥說科技

不是必須大寫的,只是通常習慣使用大寫字母定義巨集名。

例如:#define karrlen 10 // oc駝峰命名法:首字元為k,其他單詞首字元大寫

#define arr_len 10 // c語言中的巨集命名規範:所有字母大寫,單詞用下劃線分隔

語法說明:

1、巨集名一般用大寫

2、使用巨集可提高程式的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:陣列大小常用巨集定義 。

3、預處理是在編譯之前的處理,而編譯工作的任務之一就是語法檢查,預處理不做語法檢查。

4、巨集定義末尾不加分號;

5、巨集定義寫在函式的花括號外邊,作用域為其後的程式,通常在檔案的最開頭。

6、可以用#undef命令終止巨集定義的作用域

c語言中巨集定義 可以小寫嗎,一定要大寫吧?謝謝!

3樓:匿名使用者

小寫也可以,但需要注意不要與保留字或自定義變數名重或部分相同

由於擔心這方面的問題,一般習慣上全用大寫書寫定義的標識,而其他函式名或自定義變數就避免全用大寫來起名,避免無意之間的衝突。

4樓:科技引領變革

可以小寫,但是習慣上都大寫。防止衝突

用c語言程式設計:定義一個巨集,將大寫字母變成小寫字母。請高手賜教。

5樓:匿名使用者

如果確定只是大寫字母的話,那麼直接這樣就行#define lower(c) c+=32在程式中呼叫lower(c) c是字元. 當然為了保險起見,我加了個判斷. 具體見下面的程式:

#include #define lower(c) ((c >= 'a' && c <= 'z') ? (c+=32) : c)int main()

c語言巨集定義名可以有括號和分號嗎?

6樓:匿名使用者

巨集定義不需要分號的

巨集是被預編譯器處理,到編譯器的時候,巨集已經不存在了。

所以巨集的定義格式和 源**不同的。所有帶 # 號的都是預編譯命令

7樓:風若遠去何人留

巨集定義的名稱,是c語言識別符號的一種,和函式名,變數名的命名規則是一樣的,只允許使用數字,字母,下劃線,且不能以數字開頭。

所以巨集名是不可以有括號和分號的。

另外,在c語言程式設計中,一般約定巨集名用大寫字母加下劃線組成,而避免使用小寫字母。這一條並非是c語言規範強制要求,而是程式設計時的一種習慣。

也就是說,巨集定義my_print是合法的,可以被c語言編譯器接收,但一般書寫習慣更傾向於寫作my_print。

這樣約定的好處是,當遇見全部為大寫字母和下劃線組成的識別符號時,就可以認作是巨集定義了。

8樓:匿名使用者

可以這麼寫,不會出錯,不過一般標準寫法是

#define aaa() printf("a");\printf("b");\

printf("c")//這裡不要分號

9樓:匿名使用者

巨集名稱命名和變數名規則一樣

10樓:匿名使用者

我曾經見到一個應用中有這樣的巨集定義,而且在keil中編譯是通過的,沒有報錯:

#define col1() p3 |= 0x3f; p3 &= 0xfe;

#define col2() p3 |= 0x3f; p3 &= 0xfd;

#define col3() p3 |= 0x3f; p3 &= 0xfb;

#define col4() p3 |= 0x3f; p3 &= 0xf7;

#define col5() p3 |= 0x3f; p3 &= 0x2f;

#define col6() p3 |= 0x3f; p3 &= 0x1f;

誰說巨集定義中不能包含分號?

11樓:

可以的。

這種可不可以的問題,你可以自己到編譯器上去試,更快

c語言中的「巨集」是指什麼?

12樓:加百列

巨集是一種預處理指令,它提供了一種機制,可以用來替換源**中的字串。

1、條件編譯:

c語言中,預處理過程讀入源**,檢查包含預處理指令的語句和巨集定義,並對源**進行相應的轉換,預處理過程還會刪除程式中的註釋和多餘的空白符號。

預處理指令是以#開頭的**行,#必須是該行除了空白字元外的第一個字元。#後是指令關鍵字,在#和指令關鍵字之間允許存在若干空白字元。

使用巨集進行條件編譯的用法與使用巨集防止多重引用類似。示例如下:

使用條件編譯,方便程式設計師在除錯程式的過程中,執行一些在程式釋出後並不需要執行的指令。只要在需要除錯的**前加上_debug的定義,就可以在除錯程式的過程中輸出除錯資訊。

這樣方便檢視程式在執行過程中有沒有出現錯誤,定位錯誤出現的地方。而在程式釋出之前,取消_debug的定義就可以不再執行除錯**。

2、巨集函式:

函式的呼叫是需要一定的時間和空間代價的。因為系統在呼叫函式時,需要保留"現場",即將程式要執行的指令的下一條指令的位置壓入棧,然後轉入呼叫函式去執行,呼叫完函式後再返回主調函式,恢復"現場",返回到棧裡儲存的的下一條指令的位置繼續執行。

所以函式的呼叫需要額外的時間和空間代價。

而巨集函式則不存在上述問題,巨集函式在預編譯時,同函式定義的**來替換函式名,將函式**段嵌入到當前程式,不會產生函式呼叫。

所以會省去普通函式保留現場恢復現場的時間,但因為要將定義的函式體嵌入到當前程式,所以不可避免的會佔用額外的儲存空間。

在頻繁呼叫同一個巨集的時候,該現象尤其明顯。巨集函式的示例定義如下:

#define max(a,b) ((a)<(b)?(b):(a))

巨集函式的優點在於避免函式呼叫,提高程式效率。

同時需要注意的是inline識別符號。inline也將函式定義為內聯的。但是使用行內函數需要注意的是:

函式體必須十分簡單,不能含有迴圈、條件、選擇等複雜結構,否則就不能作為行內函數了。

事實上,有時候即便你沒有將函式指定為行內函數,編譯器也會將一些簡單的函式作為行內函數處理,而對於一些複雜的函式,即使宣告為行內函數,編譯器也不會理會的。

inline函式的瓶頸就在於此,使用inline識別符號將函式宣告為內聯的,但這只是一種提示,到底編譯器有沒有優化還依賴於編譯器的實現,而使用巨集函式則完全由**本身控制。

但在使用巨集函式的時候,需要明確的是巨集函式只是簡單的替換,需要注意括號的使用。

擴充套件資料:

巨集的更多規則特性:

(1)巨集名一般用大寫。

(2)使用巨集可提高程式的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:陣列大小常用巨集定義。

(3)預處理是在編譯之前的處理,而編譯工作的任務之一就是語法檢查,預處理不做語法檢查。

(4)巨集定義末尾不加分號。

(5)巨集定義寫在函式的花括號外邊,作用域為其後的程式,通常在檔案的最開頭。

(6)可以用#undef命令終止巨集定義的作用域。

(7)巨集定義不可以巢狀。

(8)字串" "中永遠不包含巨集。

(9)巨集定義不分配記憶體,變數定義分配記憶體。

(10)巨集定義不存在型別問題,它的引數也是無型別的。

13樓:榴蓮泡芙小蛋糕

是一種批量處理的稱謂。電腦科學裡的巨集是一種抽象(abstraction),它根據一系列預定義的規則替換一定的文字模式。

「巨集」這個詞的使用暗示著將小命令或動作轉化為一系列指令。

計算機語言如c語言或 組合語言有簡單的巨集系統,由編譯器或彙編器的前處理器實現。c語言的巨集前處理器的工作只是簡單的文字搜尋和替換,使用附加的文字處理語言如m4,c程式設計師可以獲得更精巧的巨集。

在objective-c語言源程式中,允許用一個識別符號來表示一個字串,稱為巨集,被定義為巨集的識別符號稱為巨集名。在編譯預處理時,對程式中所有出現的巨集名,都用巨集定義中的字串去替換,這稱為巨集替換或巨集。

巨集定義是由源程式中的巨集定義命令完成的,巨集替換是由預處理程式自動完成的。在objective-c語言中,巨集分為有引數和無引數兩種。

擴充套件資料

a類巨集是用g65 hxx p#xx q#xx r#xx或g65

hxx p#xx qxx

rxx格式輸入的,xx的意思就是數值,是以um級的量輸入的,比如你輸入100那就是0.1mm #xx就是變數號,變數號就是把數值代入到一個固定的地址中,固定的地址就是變數。

一般otd繫有#0~#100~#149~#500~#531.關閉電源時變數#100~#149被初始化成「空」,而變數#500~#531保持資料。我們如果說#100=30那麼現在#100地址內的資料就是30了。

b類巨集能完成某一功能的一系列指令像子程式那樣存入儲存器,使用者可以設定m、s、t、g**呼叫它們,使用時只需給出這個指令**就能執行其功能,也可以像呼叫子程式一樣使用。

c語言: 定義一個巨集,比較a、b的大小,不要用大於、小於和if運算子

14樓:南瓜蘋果

**如下:

#include "stdio.h"

void main()

else if(a>c&&c>b)

else if(b>a&&a>c)

else if(b>c&&c>a)

else if(c>b&&b>a)

else if(c>a&&a>b)

//編譯器不識別三個連續的符號運算,必須用且(&&)和或(||)he否(!)

}擴充套件資料

c語言中巨集定義的優點

方便程式的修改

使用簡單巨集定義可用巨集代替一個在程式中經常使用的常量,這樣在將該常量改變時,不用對整個程式進行修改,只修改巨集定義的字串即可,而且當常量比較長時, 可以用較短的有意義的識別符號來寫程式,這樣更方便一些。

相對於==全域性變數==兩者的區別如下:

1、巨集定義在編譯期間即會使用並替換,而全域性變數要到執行時才可以。

2、巨集定義的只是一段字元,在編譯的時候被替換到引用的位置。在執行中是沒有巨集定義的概念的。而變數在執行時要為其分配記憶體。

3、巨集定義不可以被賦值,即其值一旦定義不可修改,而變數在執行過程中可以被修改。

4、巨集定義只有在定義所在檔案,或引用所在檔案的其它檔案中使用。 而全域性變數可以在工程所有檔案中使用,只要再使用前加一個宣告就可以了。換句話說,巨集定義不需要extern。

c語言怎麼用輸出大寫字母z用for迴圈

include int main void printf n for i 1 i 5 i printf n for i 0 i 5 i printf n return 0 c語言 小白求解 用for迴圈語句輸出1個a 然後換行 總共輸出5行10個a 5 for int i 1 i 50 i 2 寫程...

C語言 求前驅和後繼字母。輸入大寫字母,求對應的小寫字母及它的前驅和後繼

樓主你好。include int main else if ch a else printf c c n ch1,ch2 return 0 ch,ch1,ch2應該宣告為char型別。你原先定義成為int型別會導致條件判斷的時候總是進入最後一個else中。所以只有前驅,沒有後繼。你有點粗心啊 int...

求寫有關C語言輸入大寫字母,求其對應的小寫字母及其

char c scanf c c printf c c c c 32 1,c 32,c 32 1 c語言 輸入一個大寫字母,求其對應的小寫字母及其它的前驅與後繼 include int main 如果沒有太多要求,這樣應該是可以的。c語言 求前驅和後繼字母。輸入一個大寫字母,求對應的小寫字母及它的前...