可變長度數組和常數表達式
下面提供的C 程式碼片段有可能使用某些編譯器成功編譯:
int main() { int size = 10; int arr[size]; }
根據C 標準(8.3.4/1),此代碼預計被拒絕,因為數組(arr) 的大小需要是常數表達式。然而,它引發了有關 gcc 4.8 和 Clang 3.2 等編譯器行為的問題。
可變長度數組 (VLA) 在這種情況下發揮作用。 VLA 是 gcc 和 clang 已作為 C 內的擴展實現的 C99 函數。然而,在這種情況下,Visual Studio 嚴格遵守標準。它產生的訊息:
error C2466: cannot allocate an array of constant size 0
表明它正確地將大小解釋為零,這在這種情況下是不允許的。
如果在 gcc 和 clang 中啟用 -pedantic 標誌,您將收到有關使用 VLA 的警告。例如,gcc 聲明:
warning: ISO C++ forbids variable length array 'arr' [-Wvla] int arr[size]; ^
此外,使用 -pedantic-errors 標誌將使此用法出現錯誤。有關支援的語言標準的更多信息,請參閱提供的文檔。
C 標準草稿在5.19(常數表達式)中定義了整數常數表達式,如下所示:
「整型常數表達式是一個整型或無作用域枚舉類型的表達式,隱式轉換為純右值,其中轉換後的表達式是核心常數表達式。 const (或 constexpr)用文字初始化 size。這將使 size 成為整數常數表達式:C99 草案標準 (6.7.5.2) 中的相應部分闡明,如果 size 不存在,則聲明不完整的數組類型。如果大小為*,則建立一個沒有定義長度的變長數組類型,並且只能在某些上下文中使用。否則,它是常規數組類型或基於表達式屬性的可變長度數組類型。
const int size = 10; // or constexpr int size = 10;
以上是為什麼有些編譯器允許 C 語言中的可變長度數組,而其他編譯器則不允許?的詳細內容。更多資訊請關注PHP中文網其他相關文章!