簡體   English   中英

是否有必要在 function 中取消定義宏?

[英]Is it necessary to undef macros within function?

我見過很多次這樣的代碼:

void func(){
  #define a ...
  ...
  #undef a
}

#undef有必要嗎?

這不是必需的,但#define的 scope 在定義的行之后是全局的。 它不會服從 function scope,如果你認為它會。

必要 如果該宏僅用於 function 內部,則#undef可能是個好主意。 如果你不這樣做,那只是意味着宏通過翻譯單元(源文件)的 rest 仍然可見。

無論如何,大多數宏可能都打算在整個源文件中可見,因此通常不會出現問題。

那要看。 僅當您想確保a根據您的邏輯在程序的稍后時間點可能不可用時,才需要這樣做。 define現在是全局的(在當前的翻譯單元中)!

來自gnu.org

如果一個宏不再有用,它可能用 `#undef' 指令未定義。

此外,

一旦一個宏未被定義,該標識符可以通過后續的“#define”指令重新定義為一個宏。 新定義不必與舊定義有任何相似之處。

但是,如果重新定義當前是宏的標識符,則新定義必須與舊定義有效地相同。 如果滿足以下條件,兩個宏定義實際上是相同的:

  • 兩者都是相同類型的宏(類對象或類函數)。
  • 替換列表的所有標記都是相同的。
  • 如果有任何參數,它們是相同的。
  • 空白出現在兩者的相同位置。 不過,它不必是完全相同數量的空格。 請記住,注釋算作空白。

當我像你在 function 的主體內聲明一個宏時,最后我會#undef 它。 因為很可能它僅適用於 function 主體。

通常,當您知道宏定義不會在以后任何時候使用時, #undef宏總是一個好主意,因為宏定義會傳播到包括具有宏的文件的所有其他文件。

暫無
暫無

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

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