C 中的可變長度數組:儘管處於非標準狀態,編譯器仍接受
在C 中,可變長度數組(VLA) 不是標準。然而,像 g 和 clang 這樣的編譯器令人驚訝地接受 VLA 聲明,儘管帶有有關非標準用法的警告訊息。這種意外行為引發了有關編譯器動機和標準對 VLA 立場的疑問。
編譯器接受
儘管 VLA 具有非標準性質,但編譯器仍接受 VLA 背後的原因取決於編譯器作者的決定。 C 編譯器,特別是 GCC,優先考慮與舊版 C 編譯器的兼容性,包括支援歷史上可接受但不符合 C 標準的功能。這種相容性優先的方法解釋了編譯器不願意拒絕 VLA 聲明。
標準解釋
C 標準明確禁止在 [dcl.array] 中使用 VLA 。它規定陣列聲明必須使用常數表達式指定大小,而 VLA 則不然。換句話說,C 本身並不支援分配在運行時確定大小的陣列。
編譯器實作
儘管標準禁止,但接受 VLA 的編譯器仍然這樣做透過將它們實現為語言的擴展。確切的實作因編譯器和平台而異。然而,檢查編譯器產生的彙編程式碼會發現,VLA 宣告通常會對應到堆疊分配的數組,類似於常規數組的實作方式。
結論
編譯器在 C 中接受 VLA 是偏離語言標準的編譯器擴展的一個例子。雖然此類擴展在特定情況下可能有用,但了解它們的局限性並謹慎使用它們至關重要。開發人員可以依靠編譯器警告和文件來確定 VLA 擴充在其目標編譯器環境中的可用性和行為。
以上是為什麼 C 編譯器接受可變長度數組,儘管它們是非標準的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!