我知道这是什么意思。
#define M(B) (1U << ((sizeof(x) * CHAR_BIT) - B)) // CHAR_BIT=bits/byte
但我不太理解这个:
#undef M
接下来会发生什么?M会被清除或删除吗?
#define M(B) (1U << ((sizeof(x) * CHAR_BIT) - B)) // CHAR_BIT=bits/byte
但我不太理解这个:
#undef M
接下来会发生什么?M会被清除或删除吗?
#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
这是有关此事的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);
看起来使用起来很困惑,但如果你需要处理别人的宏,这可能在实践中出现。
#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通常用于为现有宏定义提供另一个定义
#undef
来取消定义那些烦人的min
和max
宏,这些宏在windows.h中 :-) - Dean Harding#ifdef A
,然后接着使用#undef A
,#define A [...]
,最后使用#endif
。我认为如果你省略了#undef A
这一行,当你再次使用#define A
且 A 已经被定义时,编译器会发出警告。 - utnapistim