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
好。
我正在试验 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
好。