巨集的使用及細節注意

2021-07-07 08:30:56 字數 1451 閱讀 7837

1.不帶引數的巨集(一般的使用)

#define 巨集名 巨集定義字串

其含義為定義乙個名為「巨集名」的巨集,並將該巨集與其名字後的第乙個空格後知道改行結束的所有字串等價起來。然後將這個字串替換隨後程式中任何位置出現的巨集名。

2.帶引數的巨集

#define 巨集名(引數1,引數2,… ,引數n) 巨集定義字串

該語句定義了乙個名為巨集名的巨集,該巨集接收一組引數,在隨後的程式中任何出現巨集名的地方,預處理器將使用後面的巨集定義字串替換該巨集名,並將使用實際的引數替換巨集定義字串中的引數。

注意:

帶引數的巨集與函式的區別:

① 帶引數的巨集的引數列表中的引數沒有資料型別,僅是乙個名字,對應巨集定義字串中的引數

② 要注意使用括號,來避免巨集展開時可能出現的問題,如:

#include 

using

namespace

std;

//這個地方必須要加括號,否則程式不識別

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

int main()

③ 帶引數的巨集的使用類似於函式呼叫,要注意如果實參是表示式的話容易出問題,如:

#include 

#include

using

namespace

std;

#define s(r) r*r

int main()

程式執行結果為3。

原因如下:

··#define s(r) r*r

area=s(a+b);

替換過程為:第一步換為area=r*r;,第二步被換為area=a+b*a+b;

因此s(1+1) r*r 1+1*1+1 ,由於運算子優先順序的關係,最終計算結果為3。

正確的巨集定義是#define s(r) (r)*(r) 用括號限定運算子優先順序。

④ 巨集名和引數的括號間不能有空格。

⑤ 巨集的虛實結合不存在型別,也沒有型別轉換,巨集定義時其引數沒有型別可言,只是單純的名字字串。

⑥ 巨集替換在編譯前進行,不分配記憶體,巨集的展開不佔執行時間,只佔編譯時間。

⑦ 由於巨集類似於函式呼叫,又具有其獨特的方便性,所以使用恰當的話可以大大的減少程式的**量。如下面的乙個窮舉問題,定義乙個巨集作為for迴圈,然後巢狀使用即可,不用每一次再寫for語句或是拷貝、貼上導致容易出錯。

//採用帶引數的巨集讓程式編寫更加簡單

#include

using namespace std;

#define for(a) for(a=1;a<=9;a++)

int main()

cout << cnt << endl;

return

0;}

C中必須注意的巨集定義細節

1 不能忽略巨集定義的空格,如一例子 define f x x 1 當經過預編譯以後,由於巨集定義的作用僅僅是替換的作用,因此,如果使用f x 的時候,其替換如下 x x 1 x 這樣,就遠不能達到要求了。2 巨集定義與重新命名,若出現以下 define c1 struct foo typedef ...

使用mysql應該注意的細節

一.表及字段的命名規範 1.可讀性原則 使用大寫和小寫來格式化的庫物件名字以獲得良好的可讀性。例如 使用custadress而不是custaddress來提高可讀性。這裡注意有些dbms系統對表名的大小寫是敏感的 2.表意性原則 物件的名字應該能夠描述它所標識的物件 例如 對於表,表的名稱應該能夠體...

C 常用函式及注意細節

memset 以字元填充緩衝區 參考 注意細節 得加標頭檔案 include 老生常談,正確使用memset memcpy 複製乙個緩衝區到另乙個 參考 min element 和max element 作用 返回容器中最小值和最大值。max element first,end,cmp 其中cmp為...