Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C #在assert.h示例中定义_C_C Preprocessor - Fatal编程技术网

C #在assert.h示例中定义

C #在assert.h示例中定义,c,c-preprocessor,C,C Preprocessor,我试图更好地理解#定义处理,并将asssert.h文件作为一个简单的示例。代码是: # define assert(EX) (void)((EX) || (__assert (#EX, __FILE__, __LINE__),0)) 我对这个词或表达感到困惑。我假设这一行表示,如果表达式为true,则不执行任何操作,如果为false,则调用_断言函数。但是预处理器如何处理该行,或者在哪里确定断言的定义?为什么(空虚)演员 感谢您的澄清。请注意,在这种情况下,预处理器没有评估任何内容,只是 使用

我试图更好地理解#定义处理,并将asssert.h文件作为一个简单的示例。代码是:

# 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
选项显示预处理器输出。谢谢,这太完美了。对不起,这个问题口齿不清。对我来说,困难在于从预处理器替换与代码执行的角度来思考。但是你的回答非常有用。谢谢,太好了。对不起,这个问题口齿不清。对我来说,困难在于从预处理器替换与代码执行的角度来思考。但是你的回答非常有帮助。