簡體   English   中英

C ++為什么我要使用#define而不是內聯?

[英]C++ why would I use #define rather than inline?

使用C ++,何時必須 #define宏與inline 這里的文章詳細說明了為什么宏是邪惡的,為什么仍然要使用宏?

我看到一個:

  • 一些編譯器不支持帶循環的內聯

任何其他?

此外,宏的一般用法是什么?通常情況下,宏比其他實現選擇具有特權嗎?

“內聯”只是對編譯器的提示,它仍然可以拒絕在生成的代碼中內聯函數。

由於預處理器宏只是替換,因此可以保證將其內聯,因此沒有函數可以重復。

話雖如此,宏仍然是邪惡的,應該對每種情況進行評估,而不是“通用規則”,但是,如果要使用通用規則,則始終首選內聯而不是宏,或者相信編譯器比您更聰明,讓它決定通過它自己。

宏( #define )由預處理器處理。 實際上,這只是一個簡單的替換操作,無需考慮語言語法,甚至可以在編譯器查看源代碼之前就可以了。 如果宏參數有任何副作用(例如MACRO( x++ ) ),則存在多重評估的問題。

函數由編譯器處理。 它提供了正確的類型檢查和范圍,避免了多重評估問題,並且在出錯時提供了更有意義的錯誤消息。

是否曾經嘗試使用調試器來逐步執行“宏內聯”功能?

那是函數...呃... 5 -ish,宏為零。

現在,關於inline關鍵字...如果您在此方面有足夠的能力,足以在決定應該內聯和不應該內聯的方面勝過編譯器,那么您就不會問這個問題。 而且即使您某個地方遇到性能問題,也很有可能比在某個地方添加inline可以做更多有效的事情。

您總是可以用模板和內聯替換預編譯器宏。 內聯本身僅限於您指定的類型。 使用該類型,別無其他。 使用模板,您可以利用不同的類型,並對要編譯的任何內容使用相同的算法,並且對某些類型進行專門化處理。 宏的問題是,它可以多次評估表達式。 模板絕對不能這樣做,因為模板輸入僅對函數求值一次。

有些事情,例如使用STR(module)制作“模塊”字符串,僅可以使用宏。

至於內聯和舊式C宏之間比較的速度,我不知道。 我認為這是非常特定於編譯器的,您可以使用編譯器標志進行很多調整。 我從沒玩過太多游戲,只是傾向於相信最近的編譯器足夠聰明,可以真正內聯可以內聯的函數。 實際上,在大多數情況下,不需要inline關鍵字,因為編譯器也可以在沒有此類關鍵字的情況下內聯函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM