回答
這不是必需的,但#define
的範圍在定義該行後是全局的。如果你認爲它會的話,它不會服從功能範圍。
這取決於。只有當你想確保a
將不會在你的程序的後續點可能可用時,這取決於你的邏輯。 define
現在是全球性的(在當前的翻譯部門)!
從gnu.org:
如果宏不再是有用的,它可以與`和#undef」 指令是未定義的。
此外,
一旦宏已未定義,該標識符可被重新定義爲 宏通過隨後的`的#define」指令。新定義不需要 與舊定義有任何相似之處。
和
然而,如果一個標識符這是目前的宏被重新定義,然後 新定義必須是有效的一樣舊的。 兩個宏定義在以下情況下實際上是相同的:
- 兩者都是相同類型的宏(對象或函數)。
- 替換列表中的所有標記都是相同的。
- 如果有任何參數,它們是相同的。
- 空白出現在兩個相同的地方。儘管如此,它不一定是 完全相同數量的空白的 。請記住,評論計爲 空白。
但它從來沒有提供其他任何地方,除了本身。 – lexer
@lexer:什麼程序?我從來沒有說過其他*程序。 – 2011-08-09 19:09:26
@lexer :(編輯完成後)然後#undef它。它是由你決定。 – 2011-08-09 19:09:59
這不是必要。如果宏僅用於函數內部,那麼它可能是一個好主意。如果你不這樣做,那隻意味着宏通過其餘的翻譯單元(源文件)保持可見。
無論如何,大多數宏可能是在整個源文件中都可見的,所以通常這個問題不會出現。
當我聲明一個宏,就像你在一個函數體內做的那樣,然後我會在最後執行它。因爲大多數情況下它只適用於該功能體。
一般來說,當您知道宏定義不會隨後被使用時,因爲宏定義傳播到包含具有宏的文件的所有其他文件,所以對於#undef
宏總是一個好主意。
- 1. string.c_str()取消分配是否必要?
- 2. 是否有必要在php類中聲明函數的參數?
- 3. 是否有必要把內<tr>
- 4. 是否有必要有base64_encode
- 5. 是否有必要在main中聲明一個函數?
- 6. 擦除數組 - 是否有必要?
- 7. 是否有必要聲明函數的原型?
- 8. 是否真的有必要在JUnit拆卸方法中取消對象?
- 9. 回滾期間在WIX中取消註冊COM組件,是否有必要?
- 10. 是否有必要在Java中的每個類中都有構造函數
- 11. 是否有可能從函數內讀取Azure函數webhook?
- 12. Cordova.js是否必要?
- 13. _mmServerScripts是否必要?
- 14. KillTimer是否必要?
- 15. 帶有self.view.frame的initWithFrame:是否有必要?
- 16. 是否有必要召回在C++中繼承類的公共部分的宏
- 17. 是否有必要從一個Angular組件中取消訂閱Redux商店
- 18. 是否有必要在java函數中創建兩個時間日曆實例?
- 19. 是否有必要在javascript類中爲構造函數添加semicolcon?
- 20. 是否應該在函數的範圍中定義和取消定義特定於函數的C宏?
- 21. perl是否有一個內部函數來取消引用一個變量?
- 22. 是否有必要使用xlib的「XAllocSizeHints()」?
- 23. 是否有必要使用addTestDevice?
- 24. 是否有必要升級到jQuery 1.4?
- 25. char *爲char [] - 是否有必要?
- 26. 檢查RunOnUiThread是否有必要?
- 27. 服務層是否有必要?
- 28. 是否有必要更新HTML文件
- 29. SQL主鍵 - 是否有必要?
- 30. 調用ZipArchive :: close() - 是否有必要?
您是否閱讀過警告? 'prog.cpp:14:1:警告: 「somevariable」 redefined' –
如果我有'#定義一個printf( 「測試」)''中func',我永遠不能調用'一個;'中的任何其他功能。所以這不是全球性的。 – lexer
@lexer在這裏看到:http://ideone.com/ULYYp請注意,我甚至不會調用bar(),還要注意我可以在'#define'之前使用名爲'a'的變量。 –