巨集函式的注意事項

2021-07-13 06:24:10 字數 574 閱讀 5490

巨集定義注意事項:

1.巨集函式的引數沒有型別,預處理器只負責做形式上的替換,而不做引數型別檢查,所以傳參時要格外小心。

2.巨集函式定義要注意格式,尤其是括號,否則易出現優先順序錯誤。

3.巨集函式往往會導致較低的**執行效率,甚至導致預料外的結果。

比如:

#define min(a,b)((a)<(b)?(a):(b))

char *p="dfg";

char a;

a=min(*p++,'f');

printf("%c\n",a); //輸出f

實際上在我們看來*p++的值應該是d,p此時應該指向f;但在巨集定義展開時,a(即*p++)會被呼叫兩次(

在(a):(b)處被呼叫第二次),

所以最終*p++的值(我們獲得的a的值)是f,p指向g。這種情形不僅會影響**效率,也會出現難以察覺原因的錯誤。

可以通過這種方式獲得想要的結果:

char c=*p++;

if(c<'f')

printf("%c\n",c);

參考:

巨集注意事項

define a b c 如果使用a將會替換成b c,使用a b會得到b c b define a b c 如果使用a將會替換成 b c 注意上面加括號與不加是完全不同的,特別是在定義函式和函式指標的時候。下面例子 上面這行 展開應該是這樣的 這是在定義函式指標!而不是在定義函式!但是如果把括號去掉...

巨集定義的注意事項

巨集定義不是函式,它只是不同形式的替換而已,不同於函式的引數巨集定義的引數 暫且稱之為引數 不是作為乙個整體參與計算的,如下例子所示 include using namespace std define fun1 x x x define fun2 x x x int fun3 int x int ...

函式的注意事項

1 函式的形參列表可以是多個,返回值列表也可以是多個。2 形參列表和返回值列表的資料型別可以是值型別和引用型別 3 函式的命名遵循識別符號命名規範,首字母不能是數字,首字母大寫該函式可以被本報檔案和其它包檔案使用,類似public,首字母小寫,只能被本包使用,其它包檔案不能使用,類似private ...