2013-09-23 49 views
0

我讀了ISO之後:IEC 9899:TC3 6.7.5.2數組聲明符 - > 10示例4. 我想知道我以前從來沒有見過這種有用結構的代碼。可變長度數組;另一個構造MSVC不能編譯?

我寫了這個簡單的示例代碼來測試我知道它是如何工作的。

int m = 9; 

int foo (int iArray[m], int n); 


int main(int argc, char **argv) 
{ 
    int iArray[m]; 
    int n = 5; 

    iArray[n] = 555; 
    printf ("%d\r\n", foo (iArray, n)); 

    return 0; 
} 

int foo (int iArray[m], int n) 
{ 
    int iLocalArray[n]; 

    iLocalArray[n - 1] = iArray[n]; 

    return iLocalArray[n - 1]; 
} 

當我嘗試在MSVC2010上編譯此代碼....當然,它無法編譯。因爲我們知道MSVC2013以前沒有任何真正的C微軟編譯器。 但是,所以我安裝了MSVC2013RC,並認爲應該運行,因爲他們說MSVC2013包含一個真正的C99編譯器。當我開始編譯,還是同樣的錯誤:

1>[...].c(6): error C2057: expected constant expression 
1>[...].c(6): error C2466: cannot allocate an array of constant size 0 
1>[...].c(11): error C2057: expected constant expression 
1>[...].c(11): error C2466: cannot allocate an array of constant size 0 
1>[...].c(11): error C2133: 'iArray' : unknown size 
1>[...].c(20): error C2057: expected constant expression 
1>[...].c(20): error C2466: cannot allocate an array of constant size 0 
1>[...].c(22): error C2057: expected constant expression 
1>[...].c(22): error C2466: cannot allocate an array of constant size 0 
1>[...].c(22): error C2133: 'iLocalArray' : unknown size 

但是,這是其公佈爲第微軟編譯器誰尊重甚至是C99的標準編譯器相當奇怪的錯誤,不是嗎?或者我只是使用變長數組錯誤,並使用錯誤的語法?

回答

2

如果您閱讀MSVC文檔(可能會有所更改),則說明MSVC 2013 conforms to C90reference for declarations未提及VLA。還有一個roadmap for MSVC表示他們正在採取C99的戰術要素,因此不一定支持完整的標準。

因此看來,沃拉斯仍然不是C99支持的子集的一部分在2013年MSVC

+0

啊,所以我很擔心,我只注意到他們參加了'_Bool'抱歉,所以我認爲他們正在升級最終使用c99。可悲的是,情況並非如此。順帶一提,你知道MSVC13允許變量聲明後的變量聲明嗎? – dhein

+0

@Zaibis:根據[文檔](http://msdn.microsoft.com/en-us/library/ce4b8s02%28v=vs.120%29.aspx),不允許使用'如果有聲明,他們必須在任何陳述之前來。「但是我沒有編譯器在這裏測試。 – tinman

+0

剛剛由我自己檢查過。 MSVC2013允許在語句已被調用後進行變量聲明。 – dhein

相關問題