C++中 #undef 的含义是什么?

8
我知道这是什么意思。
#define M(B) (1U << ((sizeof(x) * CHAR_BIT) - B)) // CHAR_BIT=bits/byte

但我不太理解这个:

#undef M 

接下来会发生什么?M会被清除或删除吗?

3个回答

18
在使用#undef之后,就好像#define MY_MACRO这一行从未存在过一样。
int a = M(123); // error, M is undefined

#define M(B) (1U << ((sizeof(x) * CHAR_BIT) - B))

int b = M(123); // no error, M is defined

#undef M

int c = M(123); // error, M is undefined

3
这是 #undef 作用的好解释。但我认为 #undef 最常见的用法是与简单定义(如 "#define DEBUG")一起使用,而不是像问题/示例中所示的宏定义。请记住,这些是预处理器定义,不会被编译器处理。 - rotti2
1
@rotti2:是的,那是个好点子。虽然我也使用#undef来取消定义那些烦人的minmax宏,这些宏在windows.h中 :-) - Dean Harding
@rotti2:undef 的另一个用途是替换宏的定义。也就是说,你可以先使用 #ifdef A,然后接着使用 #undef A#define A [...],最后使用 #endif。我认为如果你省略了 #undef A 这一行,当你再次使用 #define A 且 A 已经被定义时,编译器会发出警告。 - utnapistim

1

这是有关此事的MSDN文章: http://msdn.microsoft.com/en-us/library/ts4w8783(VS.80).aspx

我的理解是,它删除了M的定义,以便可以用来定义其他内容。

例如:

#define M(X) 2*(X)
int a = M(2); 
ASSERT(a == 4);
#undefine M
#define M(X) 3*(X)
int b = M(2);
ASSERT(b == 6);

看起来使用起来很困惑,但如果你需要处理别人的宏,这可能在实践中出现。


0

#define和#undef是预处理器指令。

例如: #define M(X) 2*(X)

M(1);

#undef M

M(2)

因为在编译之前,预处理器将简单地替换源文件中的#define M(X) 2*(X)。

M(1)变成了2 * 1

如果预处理器找到了#undef M,它将不再进行替换

M(2)变成了2 * 2,因为当找到#undef M时,M被销毁。

#undef通常用于为现有宏定义提供另一个定义


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接