巨集定義注意事項:
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 ...