任何人都可以定義什麼是一個STRAY的定義? 。第二個問題: 我在閱讀「在21天內教自己C++」一書,他說我們不應該定義術語DEBUG。我想知道爲什麼?問題的C++預處理器定義
0
A
回答
7
第一部分:
一個流浪定義是一個預處理定義,改變了一些其他的代碼(或實際代碼),其中最有可能不會是故意的行爲。例如,你可以寫一個頭文件,並使用下面的行:
#define main is_awesome
這會不會在你的頭文件中的任何直接影響,可能甚至沒有在你的代碼,但別人,包括這個頭文件包含函數int main(int argc, char **argv)
的文件將遇到問題,因爲此雜散定義將會將該函數的名稱更改爲int is_awesome(int argc, char **argv)
,並且應用程序突然不再有main
入口點!
以類似的方式,宏DEBUG
可能會導致此類問題。通常,DEBUG
應該僅由編譯器自己定義,取決於它是否構建調試代碼(基於您的編譯器,您可能必須自己設置它)。如果你自己定義了DEBUG
,你可能會觸發調試代碼,即使你實際上正在創建一個發佈版本。
一般來說,這些錯誤或問題可能很難追查到,特別是如果您不知道如何查看預處理代碼(您無法看到基本代碼中的問題/錯誤和最有可能的線路號碼也將被關閉)。
如何避免這種情況?三個簡單的規則,這將使你的生活和其他人輕鬆了很多的:
- 只能使用預處理器定義時,你真的要(例如控制代碼包含在編譯時)。
- 始終清理(
#undef
)您不需要在頭文件之外的預處理器定義。 - 如果您必須使用某種全局預處理器定義,請使其名稱唯一,例如通過預先添加庫或項目名稱。例如。而不是定義
DEBUG
您可以使用MYLIB_DEBUG
。
+0
好天才。我很欣賞你的有用解釋 – ProDev7
相關問題
- 1. C++定義預處理器
- 2. C預處理器定義/宏
- 3. Visual C++預處理器定義
- 4. Platform C預處理器定義
- 5. C遞歸預處理器定義
- 6. C預處理器宏定義宏
- 7. 用SCons定義C++預處理器宏
- 8. 預處理#定義
- 9. C/C++預處理歧義
- 10. C++預處理器
- 11. 如何使用GNU C預處理器預定義的宏?
- 12. C:問題與預處理定義
- 13. 預處理器指令:#elif未定義?
- 14. 預處理器在Typescript中定義
- 15. 自定義gcc預處理器
- 16. 預處理器定義 - 提示構建?
- 17. OpenCL編譯器預處理定義?
- 18. GCC轉儲預處理器定義
- 19. GNU彙編預處理器定義
- 20. 保留預處理器定義
- 21. 預處理器爲m68k定義和宏?
- 22. 通過cmake定義預處理器宏
- 23. 定義一個預處理器宏
- 24. 預處理檢查定義
- 25. 預處理器錯誤C++
- 26. C++,預處理器語句
- 27. C預處理器宏
- 28. C#預處理器指令
- 29. C預處理器概念
- 30. C++預處理器變量
你可能應該讀你的書。 – progrenhard
據我所知,DEBUG沒有任何問題。不過,您希望遠離以下劃線開頭的標識符。它們以各種方式留給實施使用,所以你可以踩一些東西的腳趾。 –
好的。謝謝。我知道了 – ProDev7