C #在assert.h示例中定义
我试图更好地理解#定义处理,并将asssert.h文件作为一个简单的示例。代码是:C #在assert.h示例中定义,c,c-preprocessor,C,C Preprocessor,我试图更好地理解#定义处理,并将asssert.h文件作为一个简单的示例。代码是: # define assert(EX) (void)((EX) || (__assert (#EX, __FILE__, __LINE__),0)) 我对这个词或表达感到困惑。我假设这一行表示,如果表达式为true,则不执行任何操作,如果为false,则调用_断言函数。但是预处理器如何处理该行,或者在哪里确定断言的定义?为什么(空虚)演员 感谢您的澄清。请注意,在这种情况下,预处理器没有评估任何内容,只是 使用
# define assert(EX) (void)((EX) || (__assert (#EX, __FILE__, __LINE__),0))
我对这个词或表达感到困惑。我假设这一行表示,如果表达式为true,则不执行任何操作,如果为false,则调用_断言函数。但是预处理器如何处理该行,或者在哪里确定断言的定义?为什么(空虚)演员
感谢您的澄清。请注意,在这种情况下,预处理器没有评估任何内容,只是 使用传递的表达式对宏进行文本替换 假设变量
intx=2代码>
当您执行断言(x==3)
时,预处理器将其扩展为
(void)((x == 3) || __assert("x == 3", "test.c", 13),0);
因为x
是2,x==3
被计算为false,并且右侧的值必须为
评估(见)。当右边
被求值(假设源代码是text.c
,并且您在第13行这样做了)
\u assert
将在文本上打印x==3之类的内容。c:13。使用逗号运算符
因此,继续计算下一个表达式并返回该值作为结果
对于整个表达式(请参见),在本例中为0,因此
((x == 3) || __assert("x == 3", "test.c", 13),0);
是0\u assert
可能是一个函数或另一个宏,但由于您没有
显示了\uu assert
的定义,我将其视为一个函数
然而,如果x
为3,则x==3
将求值为true,而右侧将不为true
因为如果任何一方为真,并且
左侧已为真,则无需评估右侧
(请再次参阅)
(void)
用于在编译时关闭编译器,并显示所有警告,
编译器可能会警告您未使用的变量。请注意,在这种情况下,预处理器没有计算任何内容,只是 使用传递的表达式对宏进行文本替换 假设变量
intx=2代码>
当您执行断言(x==3)
时,预处理器将其扩展为
(void)((x == 3) || __assert("x == 3", "test.c", 13),0);
因为x
是2,x==3
被计算为false,并且右侧的值必须为
评估(见)。当右边
被求值(假设源代码是text.c
,并且您在第13行这样做了)
\u assert
将在文本上打印x==3之类的内容。c:13。使用逗号运算符
因此,继续计算下一个表达式并返回该值作为结果
对于整个表达式(请参见),在本例中为0,因此
((x == 3) || __assert("x == 3", "test.c", 13),0);
是0\u assert
可能是一个函数或另一个宏,但由于您没有
显示了\uu assert
的定义,我将其视为一个函数
然而,如果x
为3,则x==3
将求值为true,而右侧将不为true
因为如果任何一方为真,并且
左侧已为真,则无需评估右侧
(请再次参阅)
(void)
用于在编译时关闭编译器,并显示所有警告,
编译器可能会警告您未使用的变量。OR是短路评估的一个示例。“但是预处理器是如何处理行的,或者在哪里确定断言的定义?”我不知道你在问什么。
EX
是被断言的表达式。预处理器做的正是(希望如此)它想做的:在代码中适当地使用EX
扩展替换。如果你像一个预处理器一样思考,并且自己尝试了一些替换,那么假设你了解如何工作,这可能会更有意义。你应该创建一个小测试文件,并查看预处理器的输出。使用gcc或clang时,-E
选项显示预处理器输出。or是短路评估的一个示例。“但是预处理器是如何处理行的,或者在哪里确定断言的定义?”我不知道你在问什么。EX
是被断言的表达式。预处理器做的正是(希望如此)它想做的:在代码中适当地使用EX
扩展替换。如果你像一个预处理器一样思考,并且自己尝试了一些替换,那么假设你了解如何工作,这可能会更有意义。你应该创建一个小测试文件,并查看预处理器的输出。使用gcc或clang时,-E
选项显示预处理器输出。谢谢,这太完美了。对不起,这个问题口齿不清。对我来说,困难在于从预处理器替换与代码执行的角度来思考。但是你的回答非常有用。谢谢,太好了。对不起,这个问题口齿不清。对我来说,困难在于从预处理器替换与代码执行的角度来思考。但是你的回答非常有帮助。