【发布时间】:2018-03-06 23:25:37
【问题描述】:
我试图更好地理解#define 处理,并将 asssert.h 文件作为一个简单示例。代码是:
# define assert(EX) (void)((EX) || (__assert (#EX, __FILE__, __LINE__),0))
我对 OR 表达式感到困惑。我假设这一行是说如果表达式为真,则什么也不做,如果为假,则调用 __assert 函数。但是预处理器如何处理该行以及 OR 在哪里确定断言的定义?以及为什么要使用 (void) 演员表?
感谢您的澄清。
【问题讨论】:
-
OR 是短路评估的一个例子。 en.wikipedia.org/wiki/Short-circuit_evaluation
-
"但是预处理器如何处理该行以及 OR 在哪里确定断言的定义?" 我不知道你在这里问什么。
-
EX是被断言的表达式。预处理器完全按照(希望)认为的那样做:使用EX将替换扩展到您的代码中。如果您像预处理器一样思考并自己尝试了一些替换,假设您了解 stringizing 的工作原理,它可能会更有意义。 -
您应该创建一个小测试文件,并查看预处理器的输出。使用 gcc 或 clang,
-E选项会显示预处理器输出。
标签: c c-preprocessor