可能重複:
Inline functions vs Preprocessor macros帶有define或inline的C++宏?
內聯函數使用舊的C++來替換C風格的宏介紹(#定義宏名...),不過,我看到很多的C++代碼C風格的宏而不是內聯函數,內聯函數不如舊C風格的宏?
可能重複:
Inline functions vs Preprocessor macros帶有define或inline的C++宏?
內聯函數使用舊的C++來替換C風格的宏介紹(#定義宏名...),不過,我看到很多的C++代碼C風格的宏而不是內聯函數,內聯函數不如舊C風格的宏?
我會說宏不如內聯函數。
內聯函數是類型安全的,宏不是。這是他們的巨大優勢。編譯器正在幫助您製作更好的代碼。
這樣說,有一些宏可以做的功能不能。雖然這些東西並不多...
我相信C程序員已經習慣了宏並且只是將他們的習慣延續到C++中。
的唯一的事情,我可以想像依然採用宏之一是爲LINE和FILE宏被納入採伐聲明
例如:
#DEFINE TRACE(S) vGenericLogStatement(__FILE__,__LINE__, s)
哪裏vGenericLogStatement的定義類似於:
void vGenericLogStatement(char* fileName, int line, char* traceMesg);
它們也是有用的快速和髒字符串連接。
我不會說他們是劣等的。在C++中,使用宏可以做的事情並不多,你無法通過內聯函數或模板獲得相同的效果。我唯一能想到的就是'#'字符串宏操作符,如果Boost也有辦法做到這一點,我不會感到驚訝。
但是,當涉及到常量時,宏可能有一個優點 - 它們通常不會佔用任何數據空間,而是直接寫入指令流。在內存佔用少的系統上,這可能是一個主要考慮因素。
所以,基本上它是一個更好的習慣,作爲一個C++程序員使用內聯而不是宏? – snoofkin 2011-04-12 12:57:25
是的,使用你的內聯函數。 – Starkey 2011-04-12 12:58:21
有關可以使用宏執行某些操作的示例,但無法使用內聯函數執行操作,請參閱:http://stackoverflow.com/questions/4790515/advantage-of-macro-over-in-line-in- C/4790610#4790610 – 2011-04-12 13:42:11