【问题标题】:Can anyone explain this lex preprocessor output?谁能解释这个 lex 预处理器输出?
【发布时间】:2016-04-21 22:27:50
【问题描述】:

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

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

谁能猜出为什么输出不是简单的“fwrite(...)”?

【问题讨论】:

标签: c lex


【解决方案1】:
do { .. } while (0)

this 指出的#define 多语句操作的便捷方式。

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

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

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

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

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

我猜这是因为,只给出了块来编写回退/日志记录代码。

【讨论】:

  • 这解释了 do 循环 - 感谢链接。但它并不能解释空的 if 语句。代码片段是完整的代码 - 没有省略。
  • @RobertREvans :顺便问一下,你是从源代码编译 lex 的吗?值得为此检查其文档。 :)
猜你喜欢
  • 1970-01-01
  • 2017-09-12
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多