眾所周知,VLA(在C99中標準化)不是C ++中標準的一部分。因此,下面的代碼在C ++中是“非法的”:void foo(int n) { int vla[n]; for (int i = 0; i < n; ++i) { vla[i] = i; }}盡管編譯器(g ++和clang ++)將代碼作為有效語法接受,但如果啟用了flag,則僅生成警告 。-pedanticISO C ++禁止使用可變長度數組'vla'[-Wvla]我的問題是:為什么編譯器接受該聲明?編譯器不能只拒絕長度為[is-no-know-at-compile-time]?的數組?是否要遵循某種兼容語法規則?標準怎么說?從生成的匯編代碼中,我看到編譯器像正常數組一樣在循環中寫在堆棧中,但是我找不到關于標準行為的任何信息。
3 回答

心有法竹
TA貢獻1866條經驗 獲得超5個贊
為什么編譯器接受該聲明?
因為它的作者選擇這樣做。
尤其是默認情況下,GCC允許許多非標準的東西,這些東西過去一直被舊的C編譯器接受。他們喜歡這種意義上的“兼容性”。
該標準對[it]說了些什么?
確切地說,警告指出:ISO C ++禁止使用可變長度數組。
C ++沒有VLA。
在您看到一個被接受的地方,它是編譯器擴展;要了解該編譯器如何實現這種擴展,您必須詢問編譯器的作者(或檢查其來源,如果適用)。

胡子哥哥
TA貢獻1825條經驗 獲得超6個贊
該標準要求合格的編譯器在遇到非法內容時必須“發出診斷”。完成此操作后,可以繼續自由編譯具有實現特定含義的代碼。(請注意,“具有實現特定的含義”是“具有未定義的行為”的禮貌形式)。

森欄
TA貢獻1810條經驗 獲得超5個贊
“禁止”有點強。通常,該標準不禁止擴展。只要實現能夠正確處理格式正確的程序并發出所需的診斷信息,它就是合規實現。如果該實現還為某些格式錯誤的程序提供了可再現的行為,則它仍然是兼容的。該標準不關心格式錯誤的程序。
- 3 回答
- 0 關注
- 597 瀏覽
添加回答
舉報
0/150
提交
取消