回答
这不是必需的,但#define
的范围在定义该行后是全局的。如果你认为它会的话,它不会服从功能范围。
这取决于。只有当你想确保a
将不会在你的程序的后续点可能可用时,这取决于你的逻辑。 define
现在是全球性的(在当前的翻译部门)!
从gnu.org:
如果宏不再是有用的,它可以与`和#undef” 指令是未定义的。
此外,
一旦宏已未定义,该标识符可被重新定义为 宏通过随后的`的#define”指令。新定义不需要 与旧定义有任何相似之处。
和
然而,如果一个标识符这是目前的宏被重新定义,然后 新定义必须是有效的一样旧的。 两个宏定义在以下情况下实际上是相同的:
- 两者都是相同类型的宏(对象或函数)。
- 替换列表中的所有标记都是相同的。
- 如果有任何参数,它们是相同的。
- 空白出现在两个相同的地方。尽管如此,它不一定是 完全相同数量的空白的 。请记住,评论计为 空白。
但它从来没有提供其他任何地方,除了本身。 – lexer
@lexer:什么程序?我从来没有说过其他*程序。 – 2011-08-09 19:09:26
@lexer :(编辑完成后)然后#undef它。它是由你决定。 – 2011-08-09 19:09:59
这不是必要。如果宏仅用于函数内部,那么它可能是一个好主意。如果你不这样做,那只意味着宏通过其余的翻译单元(源文件)保持可见。
无论如何,大多数宏可能是在整个源文件中都可见的,所以通常这个问题不会出现。
当我声明一个宏,就像你在一个函数体内做的那样,然后我会在最后执行它。因为大多数情况下它只适用于该功能体。
一般来说,当您知道宏定义不会随后被使用时,因为宏定义传播到包含具有宏的文件的所有其他文件,所以对于#undef
宏总是一个好主意。
- 1. string.c_str()取消分配是否必要?
- 2. 是否有必要在php类中声明函数的参数?
- 3. 是否有必要把内<tr>
- 4. 是否有必要有base64_encode
- 5. 是否有必要在main中声明一个函数?
- 6. 擦除数组 - 是否有必要?
- 7. 是否有必要声明函数的原型?
- 8. 是否真的有必要在JUnit拆卸方法中取消对象?
- 9. 回滚期间在WIX中取消注册COM组件,是否有必要?
- 10. 是否有必要在Java中的每个类中都有构造函数
- 11. 是否有可能从函数内读取Azure函数webhook?
- 12. Cordova.js是否必要?
- 13. _mmServerScripts是否必要?
- 14. KillTimer是否必要?
- 15. 带有self.view.frame的initWithFrame:是否有必要?
- 16. 是否有必要召回在C++中继承类的公共部分的宏
- 17. 是否有必要从一个Angular组件中取消订阅Redux商店
- 18. 是否有必要在java函数中创建两个时间日历实例?
- 19. 是否有必要在javascript类中为构造函数添加semicolcon?
- 20. 是否应该在函数的范围中定义和取消定义特定于函数的C宏?
- 21. perl是否有一个内部函数来取消引用一个变量?
- 22. 是否有必要使用xlib的“XAllocSizeHints()”?
- 23. 是否有必要使用addTestDevice?
- 24. 是否有必要升级到jQuery 1.4?
- 25. char *为char [] - 是否有必要?
- 26. 检查RunOnUiThread是否有必要?
- 27. 服务层是否有必要?
- 28. 是否有必要更新HTML文件
- 29. SQL主键 - 是否有必要?
- 30. 调用ZipArchive :: close() - 是否有必要?
您是否阅读过警告? 'prog.cpp:14:1:警告: “somevariable” redefined' –
如果我有'#定义一个printf( “测试”)''中func',我永远不能调用'一个;'中的任何其他功能。所以这不是全球性的。 – lexer
@lexer在这里看到:http://ideone.com/ULYYp请注意,我甚至不会调用bar(),还要注意我可以在'#define'之前使用名为'a'的变量。 –