亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C ++編譯器中的可變長度數組(VLA)

C ++編譯器中的可變長度數組(VLA)

C++
哆啦的時光機 2019-12-04 11:09:42
眾所周知,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。

在您看到一個被接受的地方,它是編譯器擴展;要了解該編譯器如何實現這種擴展,您必須詢問編譯器的作者(或檢查其來源,如果適用)。


查看完整回答
反對 回復 2019-12-04
?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

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


查看完整回答
反對 回復 2019-12-04
?
森欄

TA貢獻1810條經驗 獲得超5個贊

“禁止”有點強。通常,該標準不禁止擴展。只要實現能夠正確處理格式正確的程序并發出所需的診斷信息,它就是合規實現。如果該實現還為某些格式錯誤的程序提供了可再現的行為,則它仍然是兼容的。該標準不關心格式錯誤的程序。

查看完整回答
反對 回復 2019-12-04
  • 3 回答
  • 0 關注
  • 597 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號