1)內聯函式在執行時可除錯,而巨集不可以
2)內聯函式可以訪問類的成員變數,而巨集不可以
3)在類中宣告同時定義的簡單的函式,會自動轉換為內聯函式
4)編譯器會對內聯函式的引數型別做安全檢查
:內聯函式具有巨集的替換效果,以及普通函式的安全檢查
#define max(a,b) ((a) > (b) ?(a) :(b)) //一定要帶括號,優先順序不同會造成意想不到的結果
int a=1,b=0;
max(a++,b); -> ->
等價:if(a++ > b)
return a++;
else
return b;
最後:max=2;
a=3;
max(a++,b+10); -> ->
等價:if(a++ > b+10)
return a++;
else
return b+10;
最後:b的值一直不變,最後加10等於10;
max(a,"hello"); -> 編譯不通過
#define f(x) (x+x)
int x=1;
f(x++);
等價:(x++) + (x++) -> return x+x=2
x=3f(++x);
等價:(++x) + (++x) -> return 3+3=6
x=3int x=5;
( (x++) + (++x) + (++x) ) = 21;
x=8;
【問題】:c語言巨集定義#define max(a,b) a>b?a:b 有什麼隱患?
因為巨集定義是在預編譯階段把巨集的內容拷貝的源**的相應位置
如果#define max(a,b) a>b?a:b這樣寫的話
那麼如下表示式 max(a,b)+1就展開為
a>b?a:b+1
冒號後面就是b+1了,自然和lz的當初願望,算完max再加一違背了
所以要加上括號。
內聯函式中如果複雜操作,將不被內聯,如迴圈,遞迴。
inline應該放在函式定義處,不要放在宣告前.
inline 是用以實現的關鍵字,
不是用以宣告的關鍵字.
總結:巨集替換有很多意想不到的錯誤,當要實現的東西較為複雜時,建議使用函式。
知識擴充套件:
int main()
) printf("result=%d\n", result);
}
()是乙個表示式,逗號表示式類似,但是功能更強,()中可以包含有多條語句(可以是變數定義、複雜的控制語句),該表示式的值為statement list中最後一條語句的值
typeof(expression)用來獲取expression的型別
gcc選項-ansi指示編譯器編譯符合標準的程式,但是不限制其它方式,只要它與標準不衝突。這樣,asm、typeof、inline都將無效,但是__asm__、__typeof__、__inline__還將有效。
經常與-ansi一起使用的是-pedantic選項,它嚴格按照iso標準產生需要的警告資訊,但是如果程式中使用了__extension__,則-pedantic選項對__extension__後的表示式無影響。
如果要非常嚴格,可以使用-pedantic-errors選項。這樣,所有與標準不符和的**統統被編譯器當成是錯誤而不是警告。
所以:
#define min(x,y) \這樣巨集定義,就不會出現x++,這種被執行多次的情況了.(這裡是用新的變數_x去替換,而不是用複雜的表示式替換)()
c 巨集替換與內聯函式的區別
includeusing namespace std define myfunc a,b a b a b inline int myfunc int a,int b int main 內聯函式執行結果 巨集替換執行結果 通過了解內聯函式的內部機制後,很自然會想到同樣是 的替換,那麼內聯函式的替換與巨...
內聯函式 巨集替換
傳智掃地僧課程學習筆記。inline int myfunc int a,int b 內聯函式的實現和宣告必須在一起!你可以簡單的理解為,內聯函式和巨集替換類似,也因此沒有真正函式的壓棧,出棧,適合短小的函式,內聯是一種請求,編譯器不一定就這麼處理,內聯的限制 不能有迴圈語句,不能有過多的條件判斷,下...
巨集與內聯函式的區別
總結目的 本人曾經一度選擇放棄開發崗位,然後僅僅三個月之後又覺得自己的選擇是錯誤的,還是應該繼續自己比較擅長的開發,然而一次面試卻讓我發現,很小的知識點已經遺忘。1 巨集只做簡單的字串替換,函式是引數傳遞,所以必然有引數型別檢查 支援各種型別,而不是只有字串 2 巨集不經計算而直接替換引數,函式呼叫...