Google C++ Style Guide指南建議不要在.h
(標題)文件中定義宏。這樣做的缺點是什麼?爲什麼不建議在頭文件中定義宏?
2
A
回答
5
預處理器按順序連接所有包含的源文件。如果你沒有取消定義一個宏,它可以應用於任何來源,在它之後第一次被定義。由於頭文件通常是庫的公共API,因此您在頭文件中定義的任何宏都可能以別人的代碼結尾,出現意想不到的情況。
由於意想不到的事情都是好的軟件的對立面,你應該:
- 不使用宏(地道的C++真的不應該)
- 定義他們在私人範圍(總是喜歡私人)或
- 取消定義他們在使用後立即(雖然這使他們成爲自己的代碼基本上沒用)
最好的解決方案取決於你的使用情況。通常排除包括守衛和其他簡單,安全的定義(類似於函數的宏更可能導致問題,但仍可以像定義TRUE FALSE那樣做一些愚蠢的事情)。
您也可以研究有條件地定義宏,以使它們出現在您的代碼中,但不會成爲公共API的一部分。在構建過程中檢查變量集或將宏保存在單獨的頭文件中允許其他人明確地,明確地包含它們,如果宏有助於避免大量樣板文件,這可能很方便。
1
出於與使用語句不應該在頭文件中相同的原因:命名空間污染。如果你想在一個頭文件中使用宏,確保你在頭的末尾取消定義它們,這樣它們將不會被錯誤地包含。如果您只是想在頭文件中定義它們並在cpp文件中使用它們,請確保「macros.h」從未包含在任何頭文件中。 (a)和(b)擴展到(a)+(b)。例如,你可能不希望或期望例如總和(a,b)擴展到(a)+(b)。尋找自己宏觀錯誤的根源可能是一場噩夢,找到別人幾乎是不可能的。
相關問題
- 1. 爲什麼cscope不能在頭文件中搜索定義?
- 2. 爲什麼在方法定義文件中包含頭文件?
- 3. 如何在生成文件中定義頭文件中的宏
- 4. 包含由宏定義的頭文件
- 5. 爲什麼RtlFillMemory/RtlCopyMemory定義爲宏觀
- 6. 爲什麼我不能在頭文件中定義純C函數?
- 7. 爲什麼VS2008建議編輯一個不存在的文件?
- 8. 爲什麼#定義一個空的宏?
- 9. 爲什麼SDL定義主宏?
- 10. 爲什麼「this」在胖箭頭函數定義中未定義?
- 11. 僅使用宏在頭文件中定義靜態變量
- 12. 禁用CLion中的頭文件建議
- 13. 爲什麼在這個宏定義中需要@符號?
- 14. 爲什麼在C中定義這樣的'max'宏?
- 15. 爲什麼在宏定義中使用do {} while(0)?
- 16. 爲什麼/我應該在VBA宏中定義我的變量?
- 17. 爲什麼要在相同的頭文件中轉發聲明和定義?
- 18. 爲什麼只能在頭文件中定義一個NSString常量?
- 19. 爲什麼Qt在頭文件中包含現有類的空類定義?
- 20. 宏在linux kernel.h當文件中定義
- 21. 爲什麼typeahead的建議沒有定義?
- 22. 爲什麼rails 3 application.js文件指出不建議在其中添加代碼?
- 23. 爲什麼mipmap文件夾不能在XML Android Studio的建議中顯示?
- 24. 爲什麼只定義一個宏,如果它尚未定義?
- 25. 查找c頭文件中的所有宏定義
- 26. 爲什麼java中沒有頭文件?
- 27. 爲什麼不建議使用HibernateDaoSupport?
- 28. 爲什麼使用FSTAT不建議
- 29. 爲什麼@import不建議鏈接css?
- 30. 爲什麼在視圖控制器的頭文件中沒有協議聲明?
什麼是在我們的代碼中有條件地包含宏的好例子,它不會成爲公共API的一部分? –
你可以像使用ifdef FOO_MACROS守衛一樣簡單地使用標題中的宏,然後將其定義爲構建的一部分。否則,把它們放在你的源文件(但不是你的公共頭文件)包含的標題中,允許你訪問但不分發它們。 – ssube