flex生成的C代码main函数printf无控制台输出问题咨询
问题根因定位
你遇到的main函数printf无输出问题和yyout = stdout完全无关,核心原因如下:
- C标准库的
stdout默认是行缓冲模式,只有满足以下三个条件之一才会把缓冲区的内容打印到终端:- 输出内容中包含换行符
\n - 输出缓冲区被填满
- 程序主动调用
fflush(stdout)或者正常退出时自动刷写缓冲
- 输出内容中包含换行符
- 你编写的
printf("This is working");没有加换行符,程序直接return 0退出时如果缓冲未触发刷写,自然看不到输出。你只要把这句修改为printf("This is working\n");,或者在printf后补充一行fflush(stdout);即可正常看到输出。 - 额外补充:你的main函数中没有调用
yylex(),flex生成的相关初始化逻辑根本不会执行,yyout相关的代码都没有被运行,完全不可能影响到你自行编写的printf的输出行为。
yyout = stdout的含义与设计原因
- 代码含义:
yyout是flex定义的全局文件指针变量,这行代码的作用是把它的默认值设置为标准输出流stdout,flex内置的输出宏(比如默认规则里的ECHO,用于打印未被匹配规则命中的输入内容)默认都会往yyout指向的流写入内容。 - 设计原因:这个设计是为了方便用户统一重定向flex的输出,不需要逐行修改输出语句:如果你需要把lex匹配产生的所有输出都写入文件,只需要在调用
yylex()之前添加一行yyout = fopen("自定义输出路径", "w");即可,完全不会影响你自己编写的printf等标准输出语句的行为。 - 注意:
yyout和printf默认使用的stdout是两个独立的指针变量,只是默认指向同一个标准输出流,不存在重定向或者抑制你自行编写的printf输出的可能。
内容的提问来源于stack exchange,提问作者Hayden
相关产品推荐
相关产品推荐

