首頁 >後端開發 >C++ >為什麼有些編譯器允許 C 語言中的可變長度數組,而其他編譯器則不允許?

為什麼有些編譯器允許 C 語言中的可變長度數組,而其他編譯器則不允許?

Patricia Arquette
Patricia Arquette原創
2024-12-17 11:05:26990瀏覽

Why Do Some Compilers Allow Variable Length Arrays in C   While Others Don't?

可變長度數組和常數表達式

下面提供的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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn