#undef 在 C++ 中的含义

发布于 2024-09-08 07:13:11 字数 207 浏览 2 评论 0原文

我知道这意味着什么

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

,但我不太明白这一点:

#undef M 

之后会发生什么? M被清除还是被删除了还是?

I know what this means

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

but I don't understand well this one:

#undef M 

after this what happens? M is cleared or deleted or?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

Smile简单爱 2024-09-15 07:13:11

#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

After the #undef, it's as if the #define M... line never existed.

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
允世 2024-09-15 07:13:11

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

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

EG

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

使用起来似乎很令人困惑,但如果您需要使用其他人的宏,那么在实践中可能会出现这种情况。

Here is the MSDN article about it:
http://msdn.microsoft.com/en-us/library/ts4w8783(VS.80).aspx

My understanding is that it removes the definition of M so that it may be used to define something else.

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

It seems like a confusing thing to use but may come up in practice if you need to work with someone else's macros.

昔梦 2024-09-15 07:13:11

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

例如
#定义 M(X) 2*(X)

M(1);

#undef M

M(2)

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

M(1) 与 2 * 1

如果预处理器找到 #undef M,它将不再用

2 * 2 替换 M(2),因为当找到 #undef M 时,M 将被销毁。

如果想为现有宏提供另一个定义,通常使用#undef

#define and #undef are preprocessor directives.

E.g.
#define M(X) 2*(X)

M(1);

#undef M

M(2)

Because are preprocessor directives before compilation the preprocessor will simply replace after the #define M(X) 2*(X) in that source file.

M(1) with 2 * 1

if preprocessor finds #undef M it will not replace anymore

M(2) with 2 * 2 because M is destroyed when #undef M is found.

#undef is ussualy used if want to give another definition for an existing macro

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文