我想操纵lex的输出。在ECHO宏中只有一个写入yyout。宏被“#ifndef ECHO”包围,所以我用我想要的动作替换它。 但是,我想确保正确复制原始的lex行为。 Lex将ECHO定义为此代码片段:
do {
if (fwrite( yytext, yyleng, 1, yyout )) {
}
} while (0)
有谁能猜出为什么输出不仅仅是“fwrite(...)”?
答案 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 ))
我猜这是因为,只有块才能写下备用/记录代码。