![](/img/trans.png)
[英]VS2017: How can I write per-file options in .vcxproj, without breaking the filters I've set up?
[英]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,我的一些文件正在使用它。
編譯器開關/ 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標志以覆蓋此行為。
這比我意識到的要簡單得多。
現在,無論您添加什么新文件,都將使用/ Za。
現在,只有那些文件將使用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.