2

我在 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 中进入了一个无休止的 while 循环。

相同的代码在 Visual Studio 6 中工作正常。我无法弄清楚为什么我声明yyinyyout会导致问题的方式。是否可以获得与 Visual Studio 2005 相冲突的 lexapp.c 文件,因为我相信我在步骤 4 中所做的更改会导致问题。将不胜感激你们在这里的任何意见。但是,我是 lex & yacc 的新手。

问候,

4

1 回答 1

1

VC++ 中的“编译为 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)对其进行编译。

于 2013-03-23T00:00:04.333 回答