我见过很多次这样的代码:
void func(){
#define a ...
...
#undef a
}
#undef
是否必要?
答案 0 :(得分:11)
没有必要,但#define
的范围在定义它之后是全局的。如果你认为它会不会遵守功能范围。
答案 1 :(得分:3)
这不是必要的。如果宏仅用于函数内部,那么#undef
可能是个好主意。如果不这样做,那只意味着宏通过翻译单元的其余部分(源文件)保持可见。
大多数宏可能无论如何都要在整个源文件中可见,因此通常不会出现问题。
答案 2 :(得分:1)
这取决于。只有在您希望确保a
在程序的后续位置不可用时,才有必要,具体取决于您的逻辑。 define
现在是全局的(在当前的翻译单元中)!
来自gnu.org:
如果一个宏不再有用,它可能是未定义的`#undef' 指令。
此外,
一旦未定义宏,该标识符可以重新定义为 宏由后来的`#define'指令。新定义不需要 与旧定义有任何相似之处。
和
但是,如果重新定义当前为宏的标识符, 那么新定义必须与旧定义有效相同。 如果出现以下情况,两个宏定义实际上是相同的:
- 两者都是相同类型的宏(类似于对象或函数)。
- 替换列表中的所有令牌都是相同的。
- 如果有任何参数,则它们是相同的。
- 空格出现在两者的相同位置。它不一定是 完全相同的金额 但是,空白。请记住,评论计为 空格。
答案 3 :(得分:1)
当我在函数体内声明一个宏时,我会在最后#undef它。因为很可能它仅适用于该功能体。
一般来说,当你知道宏定义不会在以后的任何时候使用时,#undef
一个宏总是一个好主意,因为宏定义传播到包含具有宏的文件的所有其他文件。