“#define assert(exp) ((void) 0)”是什么意思? 做?

发布于 2024-07-20 16:17:40 字数 270 浏览 6 评论 0原文

我在阅读 Windows Research Kernel ( WRK) 1.2:

#define assert(exp) ((void) 0)

这段代码的作用是什么? 为什么这么定义?

I came across this preprocessor definition while reading the source code in Windows Research Kernel (WRK) 1.2:

#define assert(exp) ((void) 0)

What does this code do? Why is it defined?

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

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

发布评论

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

评论(3

只想待在家 2024-07-27 16:17:41

它定义表达式assert(anything) 不执行任何操作。

据推测,所使用的环境不支持 ANSI C 断言语句,或者程序员不知道可以通过定义 NDEBUG 来禁用它。

It defines the expression assert(anything) to do nothing.

Presumably, the environment being used does not support the ANSI C assert statement, or the programmer was unaware of the fact that it could be disabled by defining NDEBUG.

心病无药医 2024-07-27 16:17:41

扩展一下 bdonlan 所说的内容,宏不展开为空的原因是因为如果它展开为空,则类似:

assert(something) // oops, missed the semi-colon
assert(another_thing);

会在发布模式下编译,但不会在调试模式下编译。 它是 ((void) 0) 而不仅仅是 0 的原因是为了防止“语句无效”警告(或任何 MSVC 所说的警告)。

To expand on what bdonlan says, the reason the macro does not expand empty is because if it did, then something like:

assert(something) // oops, missed the semi-colon
assert(another_thing);

would compile in release mode but not in debug mode. The reason it is ((void) 0) rather than just 0 is to prevent "statement with no effect" warnings (or whatever MSVC calls them).

梦过后 2024-07-27 16:17:41

补充一下,当 NDEBUG 被定义为预处理器指令时,这也是 newlibassert 的定义。 Newlib 是开源 C 库,用于 Cygwin 和嵌入式系统。

来自 newlib 中的 assert 手册:

该宏的定义是允许您关闭 assert 的所有使用
通过将 NDEBUG 定义为预处理器变量来编译时间。 如果你这样做,
assert 宏扩展为 (void(0))

Just to add, this is the definition of assert in newlib too, when NDEBUG is defined as a preprocessor directive. Newlib is the open source C library that is used on Cygwin and embedded systems.

From the assert manual in newlib:

The macro is defined to permit you to turn off all uses of assert at
compile time by defining NDEBUG as a preprocessor variable. If you do this,
the assert macro expands to (void(0))

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