C语言中#undef的含义

时间:2010-07-08 07:10:59

标签: c++ c-preprocessor

我知道这意味着什么

#define M(B) (1U << ((sizeof(x) * CHAR_BIT) - B)) // CHAR_BIT=bits/byte

但我不太清楚这个:

#undef M 

之后发生了什么? M被清除或删除或?

3 个答案:

答案 0 :(得分:14)

#undef之后,好像#define M...行从未存在过。

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

答案 1 :(得分:2)

以下是关于它的MSDN文章: http://msdn.microsoft.com/en-us/library/ts4w8783(VS.80).aspx

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

E.G。

#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);

使用它似乎是一件令人困惑的事情,但如果您需要与其他人的宏合作,可能会在实践中出现。

答案 2 :(得分:1)

#define和#undef是预处理程序指令。

E.g。  #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