2013-02-15 58 views
2

我一直在試圖關注Zed Shaw的「Learn C the Hard Way」在線課程。我在使用Visual Studio 2010中的c編譯器編譯ex17時遇到了一個問題。我總是從代碼的第100行左右得到一個錯誤。但是,當我嘗試使用Ubuntu虛擬機編譯完全相同的文件時,代碼編譯得很好。以下代碼在編譯器在「。」處生成錯誤的「{.id」處生成錯誤。有人可以解釋爲什麼這個錯誤發生在一個編譯器而不是另一個?由於它發生在Windows環境中,未來如何避免?visual studio 2010 C和Ubuntu C的結構聲明區別C

void Database_create(struct Connection *conn) 
{ 
int i = 0; 

for(i = 0; i < MAX_ROWS; i++) { 
    // Make Prototype to initialize 
    struct Address addr = {.id = i, .set = 0}; //Syntax error generated here 
    // then assign it 
    conn->db->rows[i] = addr; 
     } 
} 

注意:無論C編譯器開關是否被激活,都會在Visual Studio命令提示符中出現。

回答

1

struct Address addr = {.id = i, .set = 0};是一個C99構造 - 具體地說,{.id = i, .set = 0}初始值設定項是一個「指定初始化項」。

MS VC++通常不支持C99結構。在某些情況下,你可以通過編譯爲C++來解決這個問題,因爲在C++中支持幾個常見的C99功能(例如在塊中的語句之後允許的聲明)。但是,指定的初始化器也不是C++的一部分。

您需要使用Windows上支持C99的編譯器(例如MinGW的GCC),或者修改代碼以使其與C90兼容。如果沒有太多的C99特定的東西,這可能不是太難:

struct Address addr = {0}; 
addr.id = i; 
+0

感謝您的答案!你搖滾! – user2073935 2013-02-15 01:30:10