【问题标题】:Problems with lexapp.c in Visual Studio 2005Visual Studio 2005 中 lexapp.c 的问题
【发布时间】:2013-03-22 12:28:48
【问题描述】:

我在 Visual Studio 2005 中运行程序时遇到了一个奇怪的问题。解释我在做什么:

  1. 项目位于 Visual Studio 6 中
  2. 将项目转换为 Visual Studio 2005
  3. 在 lexapp.c 中出现错误(这是我将 app.l 文件提供给它后从 Unix 机器生成的 C 文件)

    错误 - 初始化器不是常量

    FILE *yyin = {stdin}, *yyout = {stdout};

  4. 把上面的代码改成

    FILE *yyin, *yyout;

    并将以下代码放入yylex()

    yyin = stdin; yyout = stdout;

  5. 现在可以正常编译和构建代码了。

  6. 调试发现它似乎在 lexapp.c 中进入了一个无限循环。

相同的代码在 Visual Studio 6 中运行良好。我无法弄清楚为什么我声明 yyinyyout 的方式会导致问题。是否可以获得与 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


【解决方案1】:

VC++ 中的“Compile as C”相当于 gcc 中的“-std=C89”,其中 gcc 通常编译为 GNU99(带有扩展的 C99)。当前的 C 标准是 C11。 VC++ 的“编译为 C”缺少 C99 和 C11 添加的功能。当配置为“编译为 C”时,我会将其视为过时的 C 编译器,或者将其视为配置为“编译为 C++”时的最新 C++ 编译器。这解释了为什么使用 gcc 编译的代码可能无法使用 MSVC++ 编译。我建议原始代码使用 MSVC++ 的 C89 支持中不支持的 C99 功能。

解决方案是将 C99 代码转换为等效的 C89 代码,您似乎已经完成(或开始这样做),或者使用 C99/C11 编译器(例如 gcc)对其进行编译。

【讨论】:

  • 感谢@modifiable lvalue。我现在可以编译和构建代码了。我不明白的是,改变 yyin 和 yyout 的初始化方式会导致 lexapp.c 陷入无休止的 while 循环。然而,相同的代码在 Visual Studio 6 中运行良好,没有任何问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
相关资源
最近更新 更多