在c語言中,預處理指令有什麼作用?比如define 巨集名

時間 2022-01-12 02:25:05

1樓:

c語言預處理程式的作用是根據源**中的預處理指令修改你的源**。預處理指令是一種命令語句(如#define),它指示預處理程式如何修改源**。在對程式進行通常的編譯處理之前,編譯程式會自動執行預處理程式,對程式進行編譯預處理,這部分工作對程式設計師來說是不可見的。

預處理程式讀入所有包含的檔案以及待編譯的源**,然後生成源**的預處理版本。在預處理版本中,巨集和常量識別符號已全部被相應的**和值替換掉了。如果源**中包含條件預處理指令(如#if),那麼預處理程式將先判斷條件,再相應地修改源**。

下面的例子中使用了多種預處理指令:

# include

# define true 1

# define false (!true)

# define greater (a, b) ((a) > (b) ? (true) : (false))

# define pig-latin false

void main (void);

void main (void)

else

}上例通過預處理指令定義了3個識別符號常量(即true,false和pig_latin)和一個巨集(即greater(a,b)),並使用了一組條件編譯指令。當預處理程式處理上例中的源**時,它首先讀入stdio.h標頭檔案,並解釋其中的預處理指令,然後把所有識別符號常量和巨集用相應的值和**替換掉,最後判斷pig_latin是否為true,並由此決定是使用拉丁文還是使用英文。

如果pig_latin為false,則上例的預處理版本將如下所示:

/ * here is where all the include files

would be expanded. * /

void main (void)

else

}多數編譯程式都提供了一個命令列選項,或者有一個獨立的預處理程式,可以讓你只啟動預處理程式並將源**的預處理版本儲存到一個檔案中。你可以用這種方法檢視源**的預處理版本,這對除錯與巨集或其它預處理指令有關的錯誤是比較有用的。

中國物聯網校企聯盟技術部

2樓:匿名使用者

前處理器的主要作用就是把通過預處理的內建功能對一個資源進行等價替 換,最常見的預處理有:檔案包含,條件編譯、佈局控制和巨集替換4種

檔案包含:#include 是一種最為常見的預處理,主要是做為檔案的引用組合 源程式正文。

條件編譯:#if,#ifndef,#ifdef,#endif,#undef等也是比較常見的預處理, 主要是進行編譯時

進行有選擇的挑選, 註釋掉一些指定的**, 以達到版本控制、 防止對檔案重複包含的功能。

佈局控制:

#progma,這也是我們應用預處理的一個重要方面,主要功能是 為編譯程式提供非常規的控制流資訊。 巨集替換:

#define,這是最常見的用法,它可以定義符號常量、函式功能、 重新命名、字串的拼接等各種功能

3樓:匿名使用者

預處理就是進行一個等價替換。如#include 檔名 ,就是編譯時把相應檔案替換包含進來;

#define則定義一個巨集,**中可能多次用到該常量,這樣define後就會進行替換,方便常量值的修改

4樓:匿名使用者

#define 巨集名 字串

當你在下面的程式中碰到你定義的巨集名時,就自動的替換為你定義的字串such as :#define h(x) x*x+x在程式中的h(x)就被替換為x*x+x,重點是,原樣替換,就是你定義的是什麼就按照那個形式原樣替換而不能任意加括號

for example :當碰到h(2+2)應替換為:2+2*2+2+2+2=12,而不是(2+2)*(2+2)+(2+2)=20

5樓:傷透腦筋的小蜜蜂

舉個例子

#define pi 3.14

就是在編譯程式的時候把所有的pi換成3.14,在需要用到3.14的時候可以用pi代替,掌握這一點就差不多了,還有一些更高階的定義方法,一般不用,如果是初學掌握這一點就可以了,以後慢慢學習

c語言中很多的預處理指令include、define等等它們各自的意義分別是什麼?

6樓:聽不清啊

include的作用:

#include叫做「檔案包含」 / include 語句包含並執行指定檔案。

功能:它的功能是用來指定檔案的全部內容替換程式中的命令列,從而使指定的檔案與當前原始檔連成一個原始檔

書寫格式:

#include 《檔名》 //表示編譯系統根據系統標頭檔案存放的目錄路徑去搜尋系統標頭檔案,而不是在原始檔目錄去查詢

#include "檔名" //表示編譯系統首先在當前的原始檔目錄中查詢,若未找到才根據系統的標頭檔案存放的目錄路徑去搜尋系統標頭檔案

//系統定義的標頭檔案通常使用尖括號;使用者自定義的標頭檔案通常使用雙引號。

//一般來說,如果為呼叫庫函式而用#include命令來包含相關的標頭檔案,則用尖括號,以節約查詢時間。

//如果要包含的是使用者自己編寫的檔案(這種檔案一般都在使用者當前的目錄中),一般用雙撇號。

//若檔案不在當前目錄中,在雙撇號內應該給出檔案路徑(如#include"c:\wang\file2.h")

-----------------

1.#define 的作用

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

巨集定義是由源程式中的巨集定義命令完成的。巨集代換是由預處理程式自動完成的。

在c或c++語言中,「巨集」分為有引數和無引數兩種。

2. 無參巨集定義

無參巨集的巨集名後不帶引數。

其定義的一般形式為:

#define 識別符號 字串

其中的「#」表示這是一條預處理命令。凡是以「#」開頭的均為預處理命令。「define」為巨集定義命令。「識別符號」為所定義的巨集名。「字串」可以是常數、表示式、格式串等。

例如:#define m (a+b)

它的作用是指定識別符號m來代替表示式(a+b)。在編寫源程式時,所有的(a+b)都可由m代替,而對源程式作編譯時,將先由預處理程式進行巨集代換,即用(a+b)表示式去置換所有的巨集名m,然後再進行編譯。

程式1:

#define m (a+b)

main()

上例程式中首先進行巨集定義,定義m來替代表示式(a+b),在 s= m * m 中作了巨集呼叫。在預處理時經巨集後該語句變為: s=(a+b)*(a+b)

但要注意的是,在巨集定義中表示式(a+b)兩邊的括號不能少。否則會發生錯誤。

如當作以下定義後:#difine m (a)+(b)

在巨集時將得到下述語句:s= (a)+(b)*(a)+(b)

對於巨集定義還要說明以下幾點:

1. 巨集定義是用巨集名來表示一個字串,在巨集時又以該字串取代巨集名,這只是一種簡單的代換,字串中可以含任何字元,可以是常數,也可以是表示式,預處理程式對它不作任何檢查。如有錯誤,只能在編譯已被巨集後的源程式時發現。

2. 巨集定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換。

3. 巨集定義必須寫在函式之外,其作用域為巨集定義命令起到源程式結束。如要終止其作用域可使用#undef命令。

3. 帶參巨集定義

c語言允許巨集帶有引數。在巨集定義中的引數稱為形式引數,在巨集呼叫中的引數稱為實際引數。對帶引數的巨集,在呼叫中,不僅要巨集,而且要用實參去代換形參。

帶參巨集定義的一般形式為:

#define 巨集名(形參表) 字串

在字串中含有各個形參。

帶參巨集呼叫的一般形式為:

巨集名(形參表)

例如:#define m(y) ((y)*(y)+3*(y)) /*巨集定義*/

....

k=m(5); /*巨集呼叫*/

....

在巨集呼叫時,用實參5去代替形參y,經預處理巨集後的語句為:

k=5*5+3*5

程式2:

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

main()

上例程式的第一行進行帶參巨集定義,用巨集名max表示條件表示式(a>b)?a:b,形參a,b均出現在條件表示式中。

程式第七行max=max(x,y)為巨集呼叫,實參x,y,將代換形參a,b。巨集後該語句為:

max=(x>y)?x:y;

用於計算x,y中的大數。

在c語言中"巨集"是什麼意思?

7樓:楊塵一

簡單來說:巨集定義又稱為巨集代換、巨集替換,簡稱「巨集」。是c提供的三種預處理功能的其中一種。

說明:1、巨集名一般用大寫

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

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

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

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

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

7、巨集定義可以巢狀

8、字串" "中永遠不包含巨集

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

8樓:萌萌

定義的意思,在c語言中的巨集定義就是定義外部變數,內部函式使用exiterm來呼叫

如:exiterm char c1,c2;

c語言中的巨集定義的字是:definec語言中的define巨集定義有帶引數的和不帶引數兩中形式,不帶參格式是:#define 巨集名,字串帶參格式是:

#define 巨集名(引數1,引數2,...) 字串在c語言裡巨集定義只用來做的巨集名替換,而不做語法檢查的,因而它不是c語句,所以在巨集定義的時候不需要在後面加";"巨集也在c裡也叫預處理命令,因為巨集是在程式編譯前先進行字元替換的,所以叫預處理.在c裡還有其它的預處理命令如:

#define

#undef

#ifdef等。

c語言中,巨集替換的替換規則

c語言 define 怎麼用的

9樓:大野瘦子

有三種用法,例如替代多行的**、條件編譯,還有典型的巨集定義,具體如下:

1、define最重要的用法是條件編譯

#ifdef windows

#endif

#ifdef linux

#endif

可以在編譯的時候通過#define設定編譯環境2、典型的使用方法

使用巨集定義我們可以自己根據自己的習慣來定義甚至改變c語言的語法習慣,例如:

#define begin

int main()begin

printf ("define----\n");

end定義一個迴圈

#define loop for(;;)

重新定義資料型別

#define it int

3、define可以替代多行的**,在每一個換行的時候加上一個"\"

#define max(x,y) do while(0) /* (no trailing ; ) */ \

c語言中語句和指令有什麼區別,C語言中“語句”和“指令”有什麼區別?

a羅網天下 區別一 構成不一樣 1 c程式的執行部分是由語句組成的。程式的功能也是由執行語句實現的。2 指令可以使編譯器按不同的條件編譯不同的程式部分,因而產生不同的目標 檔案。這對於程式的移植和除錯是很有用的,尤其是針對於跨平臺程式移植的時候。區別二 實現功能不一樣 1 c程式語言可以實現多種程式...

在c語言中定義的函式有什麼作用,c語言問題,c語言中的函式宣告與定義有什麼好處?

這是 模組化程式設計 的體現,通過函式可以把一個規模較大的較複雜的問題,分解為多個規模較小的簡單的問題。c語言問題,c語言中的函式宣告與定義有什麼好處? 金色潛鳥 通常把能實現某一功能操作或運算的部分抽出來,寫成函式。函式宣告與定義的好處是 主程式 比較簡潔,閱讀性強。特別是在需要多次呼叫的情況下,...

label在c語言中是什麼意思,在C語言中loop是什麼意思?

四舍 入 標籤的意思,一般用在goto語句中。比如 lable 001就是一個標籤 void main int a 0 int b printf hello lable 001 printf hello,lable 001 n a if a 5 goto lable 001 printf hello...