2013-03-22 61 views
2

我有一个在Visual Studio 2005中运行的程序解释我在做什么一个奇怪的问题:问题与lexapp.c在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步中更改了这个问题。希望你们在这里提出任何意见。不过,我是新来的yacc lex &。

问候,

+0

stdin的类型是'FILE *',因此'{stdin}'的类型是'FILE * [1]'。这个'FILE * [1]'将被默默地转换为C中的'FILE **'。你不应该在一个存储'FILE *'值的变量中存储'FILE **'值。事实上,一个C++编译器(顺便说一下,你正在使用它)会在C编译器不在这种情况下发出错误。你为什么使用C++编译器来编译C代码? – Sebivor 2013-03-22 12:41:34

+0

用C编译器和C++代码用C++编译器编译C代码,使用C++链接器将C代码链接到C++项目,您不会遇到任何问题。用C++编译器编译C代码会出现许多问题。 – Sebivor 2013-03-22 12:43:38

+0

我已经设置了编译器选项,将它编译为C代码。这没有什么区别?所有我想要做的就是使用Visual Studio 2005或更高版本调试代码,而不必将打印语句全部放在上面。 – 2013-03-22 17:14:03

回答

1
在VC

“编译为C” 是 “-std = C89” 的GCC,其中GCC通常编译为GNU99(C99与扩展)的等价物。目前的C标准是C11。 VC++的“编译为C”没有C99和C11增加的功能。当配置为“编译为C”时,我认为它是过时的C编译器,或者在配置为“编译为C++”时将其视为过时的C++编译器。这解释了为什么用gcc编译的代码可能无法用MSVC++编译。我建议原始代码使用C99功能,这些功能不在MSVC++的C89支持中。

解决方案是将C99代码转换为它的等效C89代码,看起来您已经完成(或开始执行),或者使用C99/C11编译器(例如.gcc)编译它。

+0

Thanks @modifiable lvalue。我现在可以编译和构建代码。我不明白的是改变yyin&yyout初始化的方式导致lexapp.c进入无尽的while循环。而在Visual Studio 6中,相同的代码运行良好,没有任何问题。 – 2013-03-23 07:43:05