首頁 >後端開發 >C++ >`int size = 10;` 是 C 中的常數表達式:編譯器相容性問題嗎?

`int size = 10;` 是 C 中的常數表達式:編譯器相容性問題嗎?

Patricia Arquette
Patricia Arquette原創
2024-12-09 22:08:15873瀏覽

Is `int size = 10;` a Constant Expression in C  : A Compiler Compatibility Issue?

是否「int size = 10;」產生常數表達式?

下面的程式碼片段在gcc 4.8 和Clang 3.2 中成功編譯:

int main()
{
  int size = 10;
  int arr[size];
}

根據C 標準(8.3.4/1),陣列的大小必須是整數常量表達式。然而,程式碼中的“size”似乎不是一個整型常數表達式。這是編譯器錯誤還是我們理解中的疏忽?

Visual Studio C 拒絕此程式碼並顯示訊息:「錯誤 C2466:無法指派常數大小為 0 的陣列」。這意味著編譯器認為“大小”為零。

說明

gcc 和 Clang 支援 可變長度數組 (VLA) 作為C 中的擴展。 VLA 是一項 C99 功能,允許在運行時確定陣列的大小。在程式碼片段中,「size」是在編譯時確定的,但它不是字面常數。因此,「size」在 gcc 和 Clang 中被視為 VLA。

另一方面,Visual Studio 不支援 VLA 並遵守 C 標準。結果,它拒絕代碼,因為“size”不是文字常數。

標準合規性

C 標準定義了一個積分常數表達式 作為一個表達式,在求值時會產生整型或無作用域枚舉類型的純右值。在本例中,「size」使用文字值 (10) 進行初始化,這使其成為整數常數表達式。

在 gcc 和 Clang 中使用「-pedantic」標誌將產生有關可變長度陣列的警告在程式碼片段中。使用“-pedantic-errors”將使警告成為錯誤。

為了符合C 標準,「size」可以宣告為const 或constexpr 整數:

const int size = 10;

constexpr int size = 10;

以上是`int size = 10;` 是 C 中的常數表達式:編譯器相容性問題嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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