【发布时间】:2013-03-22 12:28:48
【问题描述】:
我在 Visual Studio 2005 中运行程序时遇到了一个奇怪的问题。解释我在做什么:
- 项目位于 Visual Studio 6 中
- 将项目转换为 Visual Studio 2005
-
在 lexapp.c 中出现错误(这是我将 app.l 文件提供给它后从 Unix 机器生成的 C 文件)
错误 - 初始化器不是常量
FILE *yyin = {stdin}, *yyout = {stdout}; -
把上面的代码改成
FILE *yyin, *yyout;并将以下代码放入
yylex()yyin = stdin; yyout = stdout; 现在可以正常编译和构建代码了。
- 调试发现它似乎在 lexapp.c 中进入了一个无限循环。
相同的代码在 Visual Studio 6 中运行良好。我无法弄清楚为什么我声明 yyin 或 yyout 的方式会导致问题。是否可以获得与 Visual Studio 2005 相冲突的 lexapp.c 文件,因为我相信我在步骤 4 中所做的更改会导致问题。将不胜感激你们在这里的任何意见。但是,我是 lex 和 yacc 的新手。
问候,
【问题讨论】:
-
标准输入的类型是
FILE *,因此{stdin}的类型是FILE *[1]。FILE *[1]将在 C 中静默转换为FILE **。您不应将FILE **值存储在存储FILE *值的变量中。事实上,C++ 编译器(顺便说一下,您正在使用)会发出错误,而 C 编译器在这种情况下不会发出错误。为什么要使用 C++ 编译器来编译 C 代码? -
使用 C 编译器编译 C 代码,使用 C++ 编译器编译 C++ 代码,使用 C++ 链接器将 C 代码链接到 C++ 项目,您不会遇到问题。用C++编译器编译C代码,会出现很多问题。
-
我已设置编译器选项将其编译为 C 代码。这没有区别吗?我想要做的就是使用 Visual Studio 2005 或更高版本调试代码,而不用到处乱写打印语句。
标签: c visual-studio-2005 lex