是「int size = 10;」常數表達式?
程式碼片段:
int main() { int size = 10; int arr[size]; }
提出了關於可變長度數組 (VLA) 是否是有效的 C 功能的問題。
標準的視角
C 標準(8.3.4/1) 要求陣列大小是整數常數表達式,而「大小」似乎不是。 GCC 和 Clang 等編譯器接受此程式碼,因為它們支援 VLA 作為 C 中的擴充。遵守標準的 Visual Studio 拒絕了它。
可變長度陣列
VLA 是一項 C99 功能,可讓動態決定大小的陣列。 GCC 和 Clang 將此功能擴展到 C 。然而,VLA 不是 C 標準的一部分,在 GCC/Clang 中使用 -pedantic 標誌會產生警告或錯誤。
積分常數表達式
根據C 草案標準(5.19/3),整數常數表達式是整數或無作用域枚舉類型的表達式,隱式轉換為純右值,滿足核心常數表達式的標準。
使「size」成為常數表達式
為了遵守標準,「size」必須宣告為積分常數表達式。這可以透過以下方式實現:
結論
GCC 和 Clang 對 VLA 的接受是一種擴展,而不是 C 中的標準功能。 Visual Studio的拒絕是符合標準的。要在標準 C 中使用類似 VLA 的功能,建議使用 const 或 constexpr 使陣列大小成為整數常數表達式。
以上是`int size = 10;` 是 C 中陣列大小調整的有效常數表達式嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!