flex 生成的代码不会打印到控制台

Code generated by flex won't print to the console

我正在试验 flex 以试图更好地了解它的工作原理。我在 lex (.l) 文件中有这个:

%option noyywrap

%%
"a"   printf("Found an \"a\"");

%%

int main()
{
   printf("This is working");
   return 0;
}

暂时忽略单一规则(除非它是某种原因)我想知道为什么 main() 函数中的 printf 语句没有执行任何操作。在挖掘生成的 lex.yy.c 文件后,我怀疑行

yyout = stdout;

可能是原因,虽然我不能说为什么(我在搜索 flex 为什么这样做时找不到任何东西)

我希望不仅能理解这在 C 代码方面意味着什么,而且为什么 flex 会这样做。它似乎是抑制或重定向输出(可能是 yacc 代码?)。我将不胜感激任何解释或某些信息的链接。

(除非这只是我的 C 代码被破坏了)

如果您使用 puts 而不是 printf,则会自动为您添加一个换行符。使用 printf 打印不包含格式化转换的常量字符串毫无意义。

你当然可以自己做,把它改成

printf("This is working\n")

或:

printf("%s\n", "This is working.");

甚至更好:

fprintf(stderr, "%s\n", "This is working.");

(见下文。)

如果您不输出换行符,您的输出可能只会留在 stdio 缓冲区中(尽管它应该在 stdout 关闭时被刷新)。此外,当输出的最后一位未以换行符终止时,某些 IDE 表现不佳。 (吞字是常见症状。)总而言之,最好遵循以下准则。

总的来说:

  • 您应该始终以新行结束打印的行。

  • 你应该知道stdout行缓冲的后果,即在通常情况下,不终止输出到stdout意味着它不会被呈现马上。

  • 并且您应该养成使用 stderr 而不是 stdout 来记录消息的习惯,即使严格来说它们不是错误,也会留下 stdout用于程序的处理输出(如果您想将输出通过管道传输到另一个实用程序)。与 stdout 不同,stderr(默认情况下)通常是无缓冲的,因此会立即显示输出。 (但你仍然应该在末尾放一个换行符,而不是让光标悬在行的中间。)

    顺便说一句,

    fputs 不会自动写入换行符。但在文字字符串的情况下,它仍然比 fprintf 好。