繁体   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