當前位置:首頁 » 編程軟體 » 宏替換編譯

宏替換編譯

發布時間: 2025-03-22 19:26:42

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

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

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

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

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

(1)宏替換編譯擴展閱讀

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代碼調用它們,使用時只需給出這個指令代碼就能執行其功能,也可以像調用子程序一樣使用。

⑵ 宏替換,宏展開到底分別在什麼時候進行

//在宏 使用的時候 分為

宏定義 和 宏展開, 你那個 宏替換就是展開

宏定義是你自己寫的 #define
然後展開在預編譯時候處理
這個時候編譯器先掃描一遍文件 把用到宏的地方都做字元替換

比如
#define M 1

int a = M;
那麼預編譯的時候就把 M 替換成1

注意宏只做文本替換,所以
比如 #define MUL(__x__, __y__) __x__ * __y__

int a = MUL(a + b, c+ d);
會被替換成 int a = a + b * c + d // 可能就會和初衷違背(如果你想做的是 (a + b) * (c + b))

從展開的角度來說 因為宏是可以嵌套的 所以宏在替換的時候 我們叫做展開

比如 做一個函數參數聲明
#define PARAMS_SET_1(__type__, __name__) __type__ __name__
#define PARAMS_SET_2(__type__, __name__) __type__ __name__##1, __type__ __name__##2

//... 定義N個 PARAMS_SET_N
#define PARAMS(__size__, __type__, __name__) PARAMS_SET_##__size__(__type__, __name__)

然後 定義函數

int foo(PARAMS(2, int, n));
那麼預編譯的時候宏會這樣展開

1, int foo(PARAMS_SET_2(int, n));
2, int foo(int n1, int n2);

另外注意就是編程的時候 由於宏只是文本替換,缺少類型檢測 以及運算順序這樣的功能,所以要少用宏

上面所有的宏都有替換的方案
#define M 1 替換方案
struct M
{enum {value = 1} };
int a = M::value;

#define MUL(__x__, __y__) __x__ * __y__ 替換方案
template<int x, int y>
struct MUL
{enum{value = x * y}};

int a = MUL<10 + 20, 10 + 30>::value;

最後一個PARAMS的替換方案就是函數重載
template<typename T>
int foo(T n1);

template<typename T>
int foo(T n1, Tn2);

//後面定義N個

⑶ C語言的編譯系統對宏命令的處理

前言:宏實質就是編譯器在對代碼進行編譯之前進行的一個「查找替換」工作,就跟你在處理文檔時用WPS/WORD/記事本等進行「查找替換」操作一樣。
C語言的編譯系統對宏命令的處理是()
A。在程序運行時進行的
B。在對源程序中其他成分正式編譯之前進行的
C。在程序連續時進行的
D。和C程序中的其他語句同時進行編譯
答:選B。在對源程序中其他成分正式編譯之前進行的
2,
#defineN2/*在預編譯時將用下面代碼中N替換成2*/
#defineMN+1/*在預編譯時將M替換成N+1(即2+1,N會再被替換成2)*/
#defineNUM2*M+1/*如上:在預編譯時NUM替換成2*M+1,即2*N+1+1,即2*2+1+1*/
main()
{inti;
for(i=1;i<=NUM;i++)printf("%d\n",i);
/*
*如上所述,上句展開為:for(i=1;i<=2*2+1+1;i++)printf("%d\n",i);
*所以:循環將執行6次
*/
}
/*切記注意:每一個宏百進行替換時只是替換「正文」中的內容,而不包括預編譯語句的內容,否則就會像不少人理解的那樣,錯誤地認為第2個題中的循環將執行7次*/

熱點內容
微信模擬登陸php 發布:2025-03-23 12:56:18 瀏覽:123
ninja編譯能成功卻少了東西 發布:2025-03-23 12:46:19 瀏覽:702
python網頁數據抓取 發布:2025-03-23 12:41:20 瀏覽:659
哪些手游配置要求高 發布:2025-03-23 12:40:41 瀏覽:829
玩lol手游最低要什麼配置 發布:2025-03-23 12:17:44 瀏覽:651
傑德如何下載安卓 發布:2025-03-23 12:16:13 瀏覽:101
sql2000收縮資料庫 發布:2025-03-23 12:15:16 瀏覽:635
vc60編譯出錯 發布:2025-03-23 12:13:46 瀏覽:442
北京到歐洲伺服器搬家雲主機 發布:2025-03-23 12:11:07 瀏覽:588
ap如何設置無線密碼 發布:2025-03-23 12:10:22 瀏覽:719