① c語言中的「宏」是指什麼
是一種批量處理的稱謂。計算機科學里的宏是一種抽象(Abstraction),它根據一系列預定義的規則替換一定的文本模式。
「宏」這個詞的使用暗示著將小命令或動作轉化為一系列指令。
計算機語言如C語言或 匯編語言有簡單的宏系統,由編譯器或匯編器的預處理器實現。C語言的宏預處理器的工作只是簡單的文本搜索和替換,使用附加的文本處理語言如M4,C程序員可以獲得更精巧的宏。
在Objective-C語言源程序中,允許用一個標識符來表示一個字元串,稱為宏,被定義為宏的標識符稱為宏名。在編譯預處理時,對程序中所有出現的宏名,都用宏定義中的字元串去替換,這稱為宏替換或宏展開。
宏定義是由源程序中的宏定義命令完成的,宏替換是由預處理程序自動完成的。在Objective-C語言中,宏分為有參數和無參數兩種。
(1)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功能將源程序文件中出現的對宏的引用展開成相應的宏 定義,由預處理器來完成。經過預處理器處理的源程序與之前的源程序有所有不同,在這個階段所進行的工作的確只是純粹的替換與展開,沒有任何計算功能。
對於「帶參數的宏替換」,可以由下列代碼嘗試理解下
#include <stdio.h> #define min(x,y) ({ typeof(x) _x = (x);typeof(y) _y = (y); (void) (&_x == &_y); _x < _y ? _x : _y; }) //防止x和y為一個表達式和失去了類型檢測功能;
#define min_replace(x,y) ({ x < y ? x : y; })
void main()
{
int x=1;
int y=2;
int result = min(x++,y);
printf("沒有替換時的運行結果為:%d\n",result);
int x1=1;
int y1=2;
int result1 = min_replace(x1++,y1);
printf("替換之後的運行結果為:%d\n",result1);
return ;
}
需要注意:
宏名和參數表的括弧間不能有空格。
宏替換只做替換,不做計算和表達式求解,這一點要格外注意。
函數調用在編譯後程序運行時進行,並且分配內存。宏替換在編譯前進行,不分配內存。
宏的啞實結合(啞實結合類似於函數調用過程中實參替代形參的過程)不存在類型,也沒有類型轉換。
宏展開使源程序變長,而函數調用則不會。