是否「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中文網其他相關文章!