當前位置:首頁 » 編程語言 » c語言中什麼是宏展開
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言中什麼是宏展開

發布時間: 2023-02-05 13:37:23

c語言宏展開

宏展開就是把程序里的宏名用定義時的值原封不動地代換,如,
#define pi 3.1415926
編譯時程序中所有的pi都被換成3.1415926

❷ 在C語言中 宏定義是什麼

宏定義是C提供的三種預處理功能的其中一種,這三種預處理包括:宏定義、文件包含、條件編譯。

宏定義又稱為宏代換、宏替換,簡稱「宏」。

(2)c語言中什麼是宏展開擴展閱讀:

宏(Macro),是一種批量處理的稱謂。計算機科學里的宏是一種抽象(Abstraction),它根據一系列預定義的規則替換一定的文本模式。

解釋器或編譯器在遇到宏時會自動進行這一模式替換。對於編譯語言,宏展開在編譯時發生,進行宏展開的工具常被稱為宏展開器。

宏這一術語也常常被用於許多類似的環境中,它們是源自宏展開的概念,這包括鍵盤宏和宏語言。絕大多數情況下,「宏」這個詞的使用暗示著將小命令或動作轉化為一系列指令。

C語言是一門通用計算機編程語言,廣泛應用於底層開發。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。

盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標准規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。

二十世紀八十年代,為了避免各開發廠商用的C語言語法產生差異,由美國國家標准局為C語言制定了一套完整的美國國家標准語法,稱為ANSIC,作為C語言最初的標准。

目前2011年12月8日,國際標准化組織(ISO)和國際電工委員會(IEC)發布的C11標準是C語言的第三個官方標准,也是C語言的最新標准,該標准更好的支持了漢字函數名和漢字標識符,一定程度上實現了漢字編程。

C語言是一門面向過程的計算機編程語言,與C++,Java等面向對象的編程語言有所不同。

其編譯器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、TurboC等。

參考資料:

宏定義-網路

C語言-網路

❸ c語言中的「宏」是指什麼

是一種批量處理的稱謂。計算機科學里的宏是一種抽象(Abstraction),它根據一系列預定義的規則替換一定的文本模式。

「宏」這個詞的使用暗示著將小命令或動作轉化為一系列指令。
計算機語言如C語言或 匯編語言有簡單的宏系統,由編譯器或匯編器的預處理器實現。C語言的宏預處理器的工作只是簡單的文本搜索和替換,使用附加的文本處理語言如M4,C程序員可以獲得更精巧的宏。

在Objective-C語言源程序中,允許用一個標識符來表示一個字元串,稱為宏,被定義為宏的標識符稱為宏名。在編譯預處理時,對程序中所有出現的宏名,都用宏定義中的字元串去替換,這稱為宏替換或宏展開。

宏定義是由源程序中的宏定義命令完成的,宏替換是由預處理程序自動完成的。在Objective-C語言中,宏分為有參數和無參數兩種。

(3)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語言,說宏展開是在編譯時進行的,啥意思啥叫編譯時進行的

c語言編寫出來的代碼叫源代碼,是供人看的,如果想讓機器執行,需要轉換成機器語言,這個轉換過程就叫編譯。
在c語言中定義的宏,在編譯時,會展開(或叫替換)為實際的語句,如:
#define MAX 100
void main()
{
int a=MAX ;
printf("a=%d\n", a );
}
這里MAX是個宏,當編譯時,這段代碼就會變成:
void main()
{
int a=100; //這里的MAX會變成100
printf("a=%d\n", a );
}
這就是宏展開、宏替換,然後編譯器,按這樣子的源代碼進行編譯,生成執行程序

❺ C語言的宏(macro)是什麼怎樣使用宏

#define VERSION—STAMP "1.02" 上例中所定義的這種形式的宏通常被稱為標識符。在上例中,標識符VERSION_STAMP即代表字元串"1.02"——在編譯預處理時,源代碼中的每個VERSION_STAMP標識符都將被字元串「1.02」替換掉。 以下是另一個宏定義的例子: #define CUBE(x)((x),(x)*(x)) 上例中定義了一個名為CUBE的宏,它有一個參數x。CUBE宏有自己的宏體,即((x)*(x)*(x))——在編譯預處理時,源代碼中的每個CUBE(x)宏都將被((x)*(x)*(x))替換掉。 使用宏有以下幾點好處: (1)在輸入源代碼時,可省去許多鍵入操作。 (2)因為宏只需定義一次,但可以多次使用,所以使用宏能增強程序的易讀性和可靠性。 (3)使用宏不需要額外的開銷,因為宏所代表的代碼只在宏出現的地方展開,因此不會引起程序中的跳轉。 (4)宏的參數對類型不敏感,因此你不必考慮將何種數據類型傳遞給宏。 需要注意的是,在宏名和括起參數的括弧之間絕對不能有空格。此外,為了避免在翻譯宏時產生歧義,宏體也應該用括弧括起來。例如,象下例中這樣定義CUBE宏是不正確的: denne CUBE(x) x * x * x 對傳遞給宏的參數也要小心,例如,一種常見的錯誤就是將自增變數傳遞給宏,請看下例: #include #include CUBE(x) (x * x * x) void main (void); void main (void){int x, y;x = 5;y = CUBE( + +x); printfC'y is %d\n" . y);}在上例中,y究竟等於多少呢?實際上,y既不等於125(5的立方),也不等於336(6* 7*8),而是等於512。因為變數x被作為參數傳遞給宏時進行了自增運算,所以上例中的CUBE宏實際上是按以下形式展開的: y = ((++x) * (++x) * (++x)); 這樣,每次引用x時,x都要自增,所以你得到的結果與你預期的結果相差很遠,在上例中,由於x被引用了3次,而且又使用了自增運算符,因此,在展開宏的代碼時,x實際上為8,你將得到8的立方,而不5的立方。 上述錯誤是比較常見的,作者曾親眼見過有多年C語言編程經驗的人犯這種錯誤。因為在程序中檢查這種錯誤是非常費勁的,所以你要給予充分的注意。你最好試一下上面的例子,親眼看一下那個令人驚訝的結果值(512)。 宏也可使用一些特殊的運算符,例如字元串化運算符「#」和。連接運算符「##」。「#」運算符能將宏的參數轉換為帶雙引號的字元串,請看下例: define DEBUG_VALUE(v) printf(#v"is equal to %d.\n",v) 你可以在程序中用DEBUG_VALUE宏檢查變數的值,請看下例: int x=20; DEBUG_VALUE(x); 上述語句將在屏幕上列印"x is equal to 20"。這個例子說明,宏所使用的「#」運算符是一種非常方便的調試工具。 「##」運算符的作用是將兩個獨立的字元串連接成一個字元串。

❻ 在C語言中「宏是什麼意思」

宏定義是C提供的三種預處理功能的其中一種,這三種預處理包括:宏定義、文件包含、條件編譯

宏定義又稱為宏代換、宏替換,簡稱「宏」。
格式:
#define 標識符 字元串
其中的標識符就是所謂的符號常量,也稱為「宏名」。
預處理(預編譯)工作也叫做宏展開:將宏名替換為字元串。
掌握"宏"概念的關鍵是「換」。一切以換為前提、做任何事情之前先要換,准確理解之前就要「換」。
即在對相關命令或語句的含義和功能作具體分析之前就要換:
例:
#define PI 3.1415926
把程序中出現的PI全部換成3.1415926
說明:
(1)宏名一般用大寫
(2)使用宏可提高程序的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:數組大小常用宏定義
(3)預處理是在編譯之前的處理,而編譯工作的任務之一就是語法檢查,預處理不做語法檢查。
(4)宏定義末尾不加分號;
(5)宏定義寫在函數的花括弧外邊,作用域為其後的程序,通常在文件的最開頭。
(6)可以用#undef命令終止宏定義的作用域
(7)宏定義不可以嵌套
(8)字元串" "中永遠不包含宏
(9)宏定義不分配內存,變數定義分配內存。
(10)宏定義不存在類型問題,它的參數也是無類型的。

❼ c語言中的「宏」是指什麼

是一種批量處理的稱謂。計算機科學里的宏是一種抽象(Abstraction),它根據一系列預定義的規則替換一定的文本模式。

「宏」這個詞的使用暗示著將小命令或動作轉化為一系列指令。
計算機語言如C語言或 匯編語言有簡單的宏系統,由編譯器或匯編器的預處理器實現。C語言的宏預處理器的工作只是簡單的文本搜索和替換,使用附加的文本處理語言如M4,C程序員可以獲得更精巧的宏。

在Objective-C語言源程序中,允許用一個標識符來表示一個字元串,稱為宏,被定義為宏的標識符稱為宏名。在編譯預處理時,對程序中所有出現的宏名,都用宏定義中的字元串去替換,這稱為宏替換或宏展開。

宏定義是由源程序中的宏定義命令完成的,宏替換是由預處理程序自動完成的。在Objective-C語言中,宏分為有參數和無參數兩種。

(7)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語言程序設計

在介紹C語言的宏定義之前,需要介紹一下預處理。
什麼是預處理呢?所謂預處理是指在進行編譯的第一遍掃描(詞法掃描和語法分析)之前所做的工作。預處理是C語言的一個重要的功能,它由預處理程序負責完成。當對一個源文件進行編譯時,系統將自動引用預處理程序對源程序中的預處理部分作處理,處理完畢後自動進入對源程序的編譯。
程序中以「#」開頭的預處理命令,如包含命令#include,宏定義命令#define等。在源程序中這些命令都放在函數之外,一般放在源文件的前面,稱為預處理部分。宏定義就是預處理的一種。
C語言中允許用一個標識符來表示一個字元串,稱為「宏」。被定義為「宏」的標識符稱為「宏名」。在預編譯處理時,對程序中所有出現的「宏名」,都用宏定義中的字元串去代換,這稱為「宏代換」或「宏展開」。
C語言的「宏」分為有參數和無參數兩種,下面對這兩種「宏」分別進行討論。

1、無參宏定義
無參宏的宏名後不帶參數。
其定義的一般形式為:#define 標識符 字元串
「標識符」為所定義的宏名,「字元串」可以是常數、表達式、格式串等。
例如:
#define M (x*x+2*x+1)
它的作用是指定標識符M來代替表達式(x*x+2*x+1)。在編寫源程序時,所有的(x*x+2*x+1)都可以由M代替。而對源程序作編譯時,將先由預處理程序進行宏代換,即用(x*x+2*x+1)表達式去置換所有的宏名M,然後再進行編譯。
例如:
#include <stdio.h>
#define M (x*x+2*x+1)

main()
{
int sum,x;
printf("input a number: ");
scanf("%d",&x);
sum=3*M+4*M+5*M;
printf("sum=%d\n",sum);
}
上常式序先用宏定義M來替代表達式(x*x+2*x+1),在sum=3*M+4*M+5*M中作了宏調用。在預處理時經宏展開後該語句變為sum=3*(x*x+2*x+1)+4*(x*x+2*x+1)+5*M(x*x+2*x+1)。
對於宏定義需要注意一下幾點:
1)宏定義是用宏名來表示一個字元串,在宏展開時,又以該字元串取代宏名,這只是一種簡單的代換,字元串中可以包含任何字元,可以是常數,也可以是表達式,預處理程序不對它作任何檢查。如有錯誤,只能在編譯已被宏展開後的的源程序時發現。
2)宏定義不是說明或語句,在行末不需加分號,若加了分號則連分號一起置換。
3)宏定義必須寫在函數之外,其作用域為宏定義命令起到源程序結束。如要終止其作用域可使用#undef命令。
例如:
#define PI 3.1415926
main()
{
...
}
#undef PI
f1()
{
...
}
表示PI只在main函數中有效,在f1中無效。
4)宏名若在程序中用引號括起來,則預處理程序不對其作宏代換。
5)宏定義允許嵌套,在宏定義的字元串中可以使用已定義的宏名。在宏展開時,由預處理程序層層代換。
6)習慣上宏名用大寫字母表示,以區分變數。當然也可以用小寫字母表示。
7)可以用宏定義表示數據類型,使書寫方便。
例如:
#define U8 unsigned int
注意宏定義表示數據類型和用typedef定義數據說明符的區別:宏定義只是簡單的字元串代換,是在預處理完成的;而typedef是在編譯時處理的,它不是做簡單的代換,而是對類型說明符重新命名,被命名的標識符具有類型定義說明的功能。

2、帶參宏定義
在宏定義中的參數稱為形式參數,在宏調用中的參數稱為實際參數。
對帶參的宏,在調用中,不僅要宏展開,而且要用實參去代換形參。
帶參宏定義的一般形式為:
#define 宏名(形參表) 字元串
在字元串中含有各個形參。
帶參宏調用的一般形式為:
宏名(實參表);
例如:
#define M(y) y*y+3y /*宏定義*/
...
k=M(5) /*宏調用*/
...
在宏調用時,用實參5去替代形參y,經預處理宏展開後的語句為:
k=5*5+3*5
例如:用帶參宏來獲取較大數
#define MAX(a,b) (a>b)?a:b
對於帶參宏需要注意以下幾點:
1)帶參宏定義中,宏名和形參表之間不能有空格出現。
2)在帶參宏定義中,形式參數不分配內存單元,因此不必作類型定義。而宏調用中的實參由具體的值,要用它們去代換形參,因此必須作類型聲明。這只是符號代換,不存在值傳遞的問題。
3)在宏定義中形參是標識符,而宏調用中的實參可以是表達式。
4)在宏定義中,字元串內的形參通常要用括弧括起來以免出錯。