2013-03-22 94 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