預處理 巨集定義 條件編譯

2021-08-22 07:14:16 字數 3125 閱讀 5642

可以用#define命令將乙個指定的識別符號(即巨集名)來代表乙個字串;

巨集定義語法:#define 巨集名 字串

使用原則:

1、「原樣替換」;

2、不能代替函式;

3、定義時字尾不要加分號。

帶引數的巨集定義

#include #define s(a,b) a*b   //注意,此處不能加分號,否則就變成了s=(a*b;)

int main()

關於原樣替換,請體會下面程式用法的錯誤

/*

*作 者:hh

*完成日期:2023年08月05日

*版本號:v1.0

**問題描述:單引數的巨集定義,「原樣替換」

*輸入描述:;

*程式輸出:;

*/#include #define pi 3.1415926

#define s(r) r*r*pi

//#define s(r) (r)*(r)*pi//正確的寫法

int main()

所謂「檔案包含」處理是指乙個原始檔可以將另外乙個原始檔的全部內容包含進來。

原始檔與標頭檔案的分離,一般標頭檔案包含以下幾類內容:

1、對自定義型別的宣告;

2、被呼叫函式的宣告;

3、巨集定義:用#define定義的符號常量和巨集;

4、全域性變數的定義;

5、外部變數的宣告,例如:extern int a;

6、根據需要包含的其它標頭檔案。

「檔案包含」命令可以節省程式設計人員的重複勞動,是模組化程式設計的產物,便於多個程式設計師分別程式設計;將公用的符號常量或巨集定義等可單獨組成乙個檔案,在其它檔案的開頭用包含命令包含該檔案即可使用;公用的宣告只寫一次,除節省時間,更可觀的是減少出錯。

gcc編譯器中的標頭檔案和庫函式

標頭檔案:路徑codeblocks/mingw/include中包含.h的標頭檔案;

庫函式:路徑codeblocks/mingw/lib下的為.a的庫函式(.o目標檔案的集合)。

*作 者:hh

*完成日期:2023年8月9日

*版本號:v1.0

**問題描:條件編譯

*輸入描述:;

*程式輸出:

*/#include #define debug//條件編譯,「#define 識別符號」,該語句如果之前加//則函式中語句會被自動注釋

int main()

當所指定的識別符號已經被#define命令定義過,則在程式編譯階段只編譯程式段1,否則編譯程式段2。#endif用來限定#ifdef命令的範圍,其中#else部分也可以沒有。

#ifdef 識別符號

程式段1

# else

程式段2

#endif

//當不需要編譯程式端2時,可以寫成如下形式:

#ifdef 識別符號

程式段1

#endif

當所指定的識別符號沒有被#define命令定義過,則在程式編譯階段只編譯程式段1,否則編譯程式段2。

#ifndef 識別符號

程式段1

#else

程式段2

#endif

如常量表示式的值為真(非0),則對程式段1 進行編譯,否則對程式段2進行編譯。因此可以使程式在不同條件下,完成不同的功能。

條件指示符#ifndef 的最主要目的是防止標頭檔案的重複包含和編譯。了解:條件編譯當然也可以用條件語句來實現。 但是用條件語句將會對整個源程式進行編譯,生成的目標**程式很長,而採用條件編譯,則根據條件只編譯其中的程式段1或程式段2,生成的目標程式較短。如果條件選擇的程式段很長,採用條件編譯的方法是十分必要的。

#ifndef 標示1

#define 標示1

#endif

程式段1

該段**意思是:如果標示1沒有被定義,則重定義標示1,然後在執行程式段1、……;如果標示1已經被定義,則直接跳過,直接執行程式端1。

備註:#ifndef 和 #endif 要一起使用,如果丟失#endif,可能會報錯。

千萬不要忽略了標頭檔案中的#ifndef,這是乙個很關鍵的東西。比如你有兩個c檔案,這兩個c檔案都include了同乙個標頭檔案。而編譯時,這兩個c檔案要一同編譯成乙個可執行檔案,於是問題來了,大量的宣告衝突。還是把頭檔案的內容都放在#ifndef和#endif中吧。不管你的標頭檔案會不會被多個檔案引用,你都要加上這個。一般格式是這樣的:

#ifndef 《標識》

#define 《標識》

......

......

#endif

《標識》在理論上來說可以是自由命名的,但每個標頭檔案的這個「標識」都應該是唯一的。標識的命名規則一般是頭檔名全大寫,前面加下劃線,並把檔名中的「.」也變成下劃線,如:stdio.h

在c語言中,對同乙個變數或者函式進行多次宣告是不會報錯的。所以如果h檔案裡只是進行了宣告工作,即使不使用# ifndef巨集定義,乙個c檔案多次包含同乙個h檔案也不會報錯。但是在c++語言中,#ifndef的作用域只是在單個檔案中。所以如果h檔案裡定義了全域性變數,即使採用#ifndef巨集定義,乙個c檔案包含同乙個h檔案多次還是會出現全域性變數重定義的錯誤。使用#ifndef可以避免下面這種錯誤:如果在h檔案中定義了全域性變數,乙個c檔案包含同乙個h檔案多次,如果不加#ifndef巨集定義,會出現變數重複定義的錯誤;如果加了#ifndef,則不會出現這種錯誤。

「 條件編譯」命令允許對程式中的內容選擇性地編譯,即可以根據一定的條件選擇是否編譯。

預處理命令,巨集定義,檔案包含,條件編譯

1 c語言的預處理命令都是以 號開始的,他們不是c語言的語句,是在預編譯時處理的。2 巨集定義分為兩種 不帶引數的巨集和帶引數的巨集 所謂的函式巨集 3 巨集定義時末尾一般不要加分號 4 巨集擴充套件的整體或引數一般要用 括起來 5 檔案包含是編寫c語言程式中不可缺少的,很重要 6 使用條件編譯的主...

預處理 巨集定義

1,預處理 預處理是指在進行編譯的第一遍掃瞄 詞法掃瞄和語法分析 之前所作的工作。預處理是 語言的乙個重要功能,它由預處理程式負責完成。當對乙個原始檔進行編譯時,系統將自動引用預處理程式對源程式中的預處理部分作處理,處理完畢自動進入對源程式的編譯。語言提供了多種預處理功能,如巨集定義 檔案包含 條件...

預處理 條件編譯

假如現在要開發乙個c語言程式,讓它輸出紅色的文字,並且要求跨平台,在 windows 和 linux 下都能執行,怎麼辦呢?這個程式的難點在於,不同平台下控制文字顏色的 不一樣,我們必須要能夠識別出不同的平台。windows 有專有的巨集 win32,linux 有專有的巨集 linux 以現有的知...