2013-04-05 49 views
1

我試圖在Visual Studio Express的2010C代碼從GCC到Visual Studio Express的2010

我有以下的頭文件將一些代碼,我已經寫了,並用gcc編譯成功地。

#ifndef _SYMTAB_H_ 
#define _SYMTAB_H_ 

#define NHASH 997 

typedef enum {NOTYPE, INTTYPE, DOUBLETYPE, STRINGTYPE} SYMBOLTYPE; 

typedef union { 
    int intvalue; 
    double doublevalue; 
    char *stringvalue; 
} SYMBOLVALUE; 

typedef struct { 
    SYMBOLTYPE type; 
    char *name; 
    SYMBOLVALUE value; 
} SYMBOL; 

void initSymbolTable(void); 
SYMBOL *lookup(char *sym); 
SYMBOL *addIntSymbol(char *name, int value); 
SYMBOL *addDoubleSymbol(char *name, double value); 
SYMBOL *addStringSymbol(char *name, char *value); 
char *getSymbolName(SYMBOL *sym); 
int getIntSymbolValue(SYMBOL *sym); 
double getDoubleSymbolValue(SYMBOL *sym); 
char *getStringSymbolValue(SYMBOL *sym); 
void printSymbolTable(void); 

#endif 

如果我使用頭文件,如寫一段代碼:

int main(int argc, char *argv[]) { 
    initSymbolTable(); 

    printSymbolTable(); 

    SYMBOL *intSymbol = addIntSymbol("pippo", 10); 

    printSymbolTable(); 

    printf("All tests successfull\n"); 
    return 0; 
} 

我得到的跟隨着錯誤:

錯誤C2275:「符號」:非法使用這種類型的作爲表達

是descrideb這裏:http://msdn.microsoft.com/en-us/library/76c9k4ah(v=vs.71).aspx

無論如何,我不明白這有什麼問題。 我還在C/C++ - > Advanced下的prject屬性中將「編譯爲」屬性設置爲「編譯爲C代碼」。而且所有文件都保存爲* .c和* .h。

+1

MSVC++不是C編譯器,因爲它沒有實現C99標準;它無法編譯使用C99標準(1999年批准;十年前)批准的功能的有效C代碼。解決方案:不要使用C++編譯器來編譯C代碼。 – Sebivor 2013-04-05 14:20:05

回答

3

您無法在Visual Studio支持的C版本中聲明變量中間函數。你需要做的頂部聲明它:或者

int main(int argc, char *argv[]) { 
    SYMBOL *intSymbol; 

    initSymbolTable(); 

    printSymbolTable(); 

    intSymbol = addIntSymbol("pippo", 10); 
    ... 
+0

它在C99中是合法的,但MS只支持不允許的C89。 – hmjd 2013-04-05 14:04:21

1

,您可以用鼠標右鍵單擊該投在解決方案資源管理器中的錯誤.c文件,轉到C/C++ - >高級,並設置編譯至於編譯爲C++代碼。這樣你就不需要編輯你的源代碼。

+1

你不需要將C編譯爲C++,並期望它可以工作。 – RichieHindle 2013-04-05 14:11:45

+0

這是正確的,它只是抱怨strdup,因爲它已被棄用......無論如何,我需要純粹的C代碼。不管怎麼說,還是要謝謝你。 – salvo 2013-04-05 14:12:27

+0

@salvo:不確定'純C代碼'是什麼意思。你的代碼將保持純C.如果你的意思是生成的二進制代碼,那麼不應該有任何的財務差異,你只是爲Windows編譯。 – 2013-04-05 14:22:32

相關問題