簡體   English   中英

如何在VS2017中不使用/ Za編譯一個文件(使用/ Za編譯其余文件)?

[英]How can I compile one file without /Za (and the rest with /Za) in VS2017?

我希望能夠在不使用Microsoft語言擴展名的情況下編譯VS2017 C ++項目。

根據這里的答復, / Za編譯器指令不會在VS2010中編譯系統頭文件 ,是否有辦法使VS編譯一個不帶/ Za的文件,而其余的帶/ Za呢?

特別不喜歡/ Za標志的文件是Winnt.h,我的一些文件正在使用它。

根據Visual Studio開發人員的說法

編譯器開關/ Za是數十年前開始的一項工作,旨在在多個C ++編譯器之間實現嚴格的可移植行為。 這項工作已停止,我們不再建議將其用於新項目。 開關/ Za不支持某些關鍵的Microsoft SDK頭文件。 相比之下,/ permissive-提供了一種有用的一致性模式,其中輸入的C ++代碼根據ISO C ++規則進行解釋,但是還允許在Visual C ++支持的目標上編譯C ++所需的一致性擴展。 例如,您可以將/ permissive-與C ++ / CLI一起使用。 編譯器開關/ Za拒絕一些不合格的構造; 但是,我們建議繼續使用編譯器開關/ permissive-以使代碼一致。

因此,使用/permissive-編譯整個項目,而不是嘗試使用/Za對單個翻譯單元實施例外,這可能是在符合ISO-C ++與能夠編譯非標准Microsoft頭文件之間/Za一項可接受的回報。 此外,您可以通過使用/Zc標志及其選項來禁用更多擴展名:

當前,默認情況下,編譯器開關/ Zc:strictStrings和/ Zc:rvalueCast處於關閉狀態,從而允許出現不一致的行為。 開關/ permissive-默認情況下將其打開。 如果需要,可以在/ permissive-之后傳遞/ Zc標志以覆蓋此行為。

這比我意識到的要簡單得多。

  1. 右鍵單擊解決方案資源管理器中的項目,轉到“屬性”->“ C \\ C ++”->“語言”->“禁用語言擴展”->“是(/ Za)”
  2. 點擊確定。

現在,無論您添加什么新文件,都將使用/ Za。

  1. 按住Shift鍵,選擇你所需要的使用/ Za -的文件。
  2. 重復步驟1,但現在將“禁用語言擴展”設置為“否”。

現在,只有那些文件將使用Microsoft的語言擴展名構建。

無需進行vcxproj編輯(以及由此產生的過濾器麻煩),無需設置文件以停止從項目默認值繼承,也無需弄亂/ Ze或/ Zc或任何手動命令行混亂。 我浪費的時間沒有意識到這是多么簡單。 > _ <

其他一些注意事項:由於這里的建議以及推拉各種杠桿的作用,我發現了以下幾點:

  • Visual C ++ Team Blog (感謝Jodocus)上討論的/ permissive-命令行選項顯然可以滿足我的需求。 但是我發現它根本沒有捕獲匿名結構,所以也許我做錯了什么,但是並沒有強迫我的代碼符合ISO C ++的要求。

  • / Zc編譯器選項沒有提及匿名結構,因此,如果其中之一捕獲了不合格的匿名結構,我將無法分辨。 由於這是ISO C ++的一件事,我無法明確地進行介紹,因此我也對這些標志失去了信心。

  • 如果有問題的文件是頭文件,則必須為每個包含有問題的頭文件的源文件禁用/ Za。

  • 最后,這也可以通過編程來代替。 請參閱DisableLanguageExtensions

從技術上講,這是將一些元數據分配給整個文件組的方法,但是使用MSBuild在一個文件中將其忽略:

 <ItemGroup> <Compile Include="**\\*.cpp" Exclude="foo.cpp"> <SomeCompilerSettingMetaData>/Za</SomeCompilerSettingMetaData> </Compile> <Compile Include="foo.cpp" > <SomeCompilerSettingMetaData></SomeCompilerSettingMetaData> </Compile> </ItemGroup> 

我不記得將/ Za分配給哪個編譯器設置,對於此插圖而言,這並不重要。 關鍵是“項目”列表上的“ 包括”和“ 排除”屬性應排除並包括您要針對特殊設置而單獨列出的文件。 請注意,在最后一個中,缺少正在查看的編譯器設置。

暫無
暫無

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

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