是否有必要在函数内使用undef宏?

时间:2011-08-09 19:06:21

标签: c macros

我见过很多次这样的代码:

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

#undef是否必要?

4 个答案:

答案 0 :(得分:11)

没有必要,但#define的范围在定义它之后是全局的。如果你认为它会不会遵守功能范围。

答案 1 :(得分:3)

这不是必要的。如果宏仅用于函数内部,那么#undef可能是个好主意。如果不这样做,那只意味着宏通过翻译单元的其余部分(源文件)保持可见。

大多数宏可能无论如何都要在整个源文件中可见,因此通常不会出现问题。

答案 2 :(得分:1)

这取决于。只有在您希望确保a在程序的后续位置不可用时,才有必要,具体取决于您的逻辑。 define现在是全局的(在当前的翻译单元中)!

来自gnu.org

  

如果一个宏不再有用,它可能是未定义的`#undef'   指令。

此外,

  

一旦未定义宏,该标识符可以重新定义为   宏由后来的`#define'指令。新定义不需要   与旧定义有任何相似之处。

  

但是,如果重新定义当前为宏的标识符,   那么新定义必须与旧定义有效相同。   如果出现以下情况,两个宏定义实际上是相同的:

     
      
  • 两者都是相同类型的宏(类似于对象或函数)。
  •   
  • 替换列表中的所有令牌都是相同的。
  •   
  • 如果有任何参数,则它们是相同的。
  •   
  • 空格出现在两者的相同位置。它不一定是   完全相同的金额    但是,空白。请记住,评论计为   空格。
  •   

答案 3 :(得分:1)

当我在函数体内声明一个宏时,我会在最后#undef它。因为很可能它仅适用于该功能体。

一般来说,当你知道宏定义不会在以后的任何时候使用时,#undef一个宏总是一个好主意,因为宏定义传播到包含具有宏的文件的所有其他文件。