我知道这意味着什么
#define M(B) (1U << ((sizeof(x) * CHAR_BIT) - B)) // CHAR_BIT=bits/byte
但我不太清楚这个:
#undef M
之后发生了什么? M被清除或删除或?
答案 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