[英]Do #ifdef, #ifndef and #undef work with function-like macros?
[英]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.