2011-08-09 20 views

回答

11

这不是必需的,但#define的范围在定义该行后是全局的。如果你认为它会的话,它不会服从功能范围。

+2

您是否阅读过警告? 'prog.cpp:14:1:警告: “somevariable” redefined' –

+0

如果我有'#定义一个printf( “测试”)''中func',我永远不能调用'一个;'中的任何其他功能。所以这不是全球性的。 – lexer

+3

@lexer在这里看到:http://ideone.com/ULYYp请注意,我甚至不会调用bar(),还要注意我可以在'#define'之前使用名为'a'的变量。 –

1

这取决于。只有当你想确保a将不会在你的程序的后续点可能可用时,这取决于你的逻辑。 define现在是全球性的(在当前的翻译部门)!

gnu.org

如果宏不再是有用的,它可以与`和#undef” 指令是未定义的。

此外,

一旦宏已未定义,该标识符可被重新定义为 宏通过随后的`的#define”指令。新定义不需要 与旧定义有任何相似之处。

然而,如果一个标识符这是目前的宏被重新定义,然后 新定义必须是有效的一样旧的。 两个宏定义在以下情况下实际上是相同的:

  • 两者都是相同类型的宏(对象或函数)。
  • 替换列表中的所有标记都是相同的。
  • 如果有任何参数,它们是相同的。
  • 空白出现在两个相同的地方。尽管如此,它不一定是 完全相同数量的空白的 。请记住,评论计为 空白。
+0

但它从来没有提供其他任何地方,除了本身。 – lexer

+0

@lexer:什么程序?我从来没有说过其他*程序。 – 2011-08-09 19:09:26

+0

@lexer :(编辑完成后)然后#undef它。它是由你决定。 – 2011-08-09 19:09:59

3

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

无论如何,大多数宏可能是在整个源文件中都可见的,所以通常这个问题不会出现。

1

当我声明一个宏,就像你在一个函数体内做的那样,然后我会在最后执行它。因为大多数情况下它只适用于该功能体。

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

相关问题