簡體   English   中英

ms-extensions 標志對 gcc 有什么作用?

[英]What does the ms-extensions flag do exactly with gcc?

GCC 有一個標志-fms-extensions

這個標志究竟有什么作用? 為什么它有時默認開啟,為什么它存在?

根據 gcc 9.1.0 源代碼(grepped for flag_ms_extensions ),效果是:

  • (C) 允許 Microsoft 版本的匿名聯合和結構。 這包括對C11 匿名聯合和結構以及Microsoft 特定風格的支持,包括完全省略大括號成員列表,並將成員放置在父命名空間中,即使結構/聯合具有標識符。
  • (C++) 允許類成員與其類型具有相同的名稱(例如using foo = int; struct A { foo foo; } )。 禁用 ms-extensions 后,行為是在 C 中接受此代碼(在合法的地方); extern "C"塊,除非給出了-pedantic標志。 此錯誤消息是declaration of NAME changes meaning of NAME
  • (C++) 允許隱式 int ; 現在允許任何會產生診斷ISO C++ forbids declaration of NAME with no type情況,並假定ISO C++ forbids declaration of NAME with no typeint 示例: const *p; const f(); .
  • (C++) 允許從命名非靜態成員函數的限定 id隱式轉換為指向成員的指針。 在 ISO C++ 中,需要&運算符來執行該轉換。
  • (C++) 允許&f形成指向成員的指針,如果f (非限定 ID)在該上下文中命名非重載成員函數。 ISO C++ 要求使用類名進行顯式限定。

如果目標 ABI 是 Microsoft ABI,則該標志默認打開。 可以通過手動指定-fno-ms-extensions來禁用它。


這背后的理由是一個更棘手的問題。 文檔必須說:

接受 Microsoft 頭文件中使用的一些非標准結構。

禁用有關 MFC 中使用的構造的 Wpedantic 警告。

所以我假設基本原理是允許 g++ 構建依賴於 MSVC 供應商提供的標頭中的非標准代碼的MFC應用程序。

我不確定它在 2019 年的相關性如何,我認為可以為 gcc 默認關閉此標志提供一個很好的案例。 (如果用戶想構建一個舊的 MFC 應用程序,他們總是可以指定它)。

例如,MSVC 19.xx(迄今為止的最新版本)在其默認模式下不再允許最后三個項目符號點。 (它仍然允許foo foo;即使有/Za標志)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM