任何人都可以解释这个lex预处理器输出吗?

时间:2016-04-21 13:43:04

标签: c lex

我想操纵lex的输出。在ECHO宏中只有一个写入yyout。宏被“#ifndef ECHO”包围,所以我用我想要的动作替换它。 但是,我想确保正确复制原始的lex行为。 Lex将ECHO定义为此代码片段:

do { 
    if (fwrite( yytext, yyleng, 1, yyout )) {
        } 
    } while (0)

有谁能猜出为什么输出不仅仅是“fwrite(...)”?

1 个答案:

答案 0 :(得分:1)

do { .. } while (0)

是#{3}}指出的#define多语句操作的便捷方式。

通过

if (fwrite( yytext, yyleng, 1, yyout ))

我相信您可以选择处理fwrite失败。

在这里,您可以使用 1个大小为yyleng的元素来调用fwrite。考虑到fwrite返回写入的元素总数,可能的返回值仅为0和1 - 0表示任何失败,1表示成功。

理想情况下(或实际上是?),应该是

if (!fwrite( yytext, yyleng, 1, yyout ))

我猜这是因为,只有块才能写下备用/记录代码。