如何在VS2017中编译没有/ Za(其余为/ Za)的文件?

时间:2017-10-23 11:44:43

标签: c++ msbuild visual-studio-2017

我希望能够在没有Microsoft的语言扩展恶作剧的情况下编译我的VS2017 C ++项目。

基于这里的回复/Za compiler directive does not compile system headers in VS2010,有没有办法让VS编译一个没有/ Za的文件,其余的用?

特别是不喜欢/ Za标志的文件是Winnt.h,我的几个文件正在使用它。

3 个答案:

答案 0 :(得分:2)

根据Visual Studio devs:

  

编译器开关/ Za是几十年前开始的一项努力   跨多个C ++编译器的严格可移植行为。努力   停滞不前,我们不再推荐它用于新项目。开关   / Za不支持某些关键的Microsoft SDK头文件。通过   对比/允许 - 提供一个有用的一致性模式,其中输入C ++   代码根据ISO C ++规则解释,但也允许   符合在支持的目标上编译C ++所必需的扩展   Visual C ++。例如,您可以使用/ permissive-与C ++ / CLI。该   编译器开关/ Za拒绝一些不符合的结构;然而   编译器开关/许可 - 是我们未来的建议   用于符合规范。

因此,使用/permissive-编译整个项目而不是尝试使用/Za实现单个翻译单元的例外可能是符合ISO-C ++和能够编译非标准的Microsoft头文件。此外,您可以通过使用/Zc标志及其选项来禁用更多扩展程序:

  

编译器切换/ Zc:strictStrings和/ Zc:rvalueCast是   默认情况下,当前关闭,允许不符合行为。开关   / permissive-默认打开它们。您可以传入/ Zc标志   after / permissive-在需要时覆盖此行为。

答案 1 :(得分:1)

这比我意识到的要简单得多。

  1. 在解决方案资源管理器中右键单击该项目,转到属性 - > C \ C ++ - >语言 - >停用语言扩展程序 - >是(/ Za)
  2. 点击确定。
  3. 现在无论你添加什么新文件都会使用/ Za。

    1. 按住Shift并选择使用/ Za所需的所有文件。
    2. 重复步骤1,但现在将“禁用语言扩展”设置为“否”
    3. 现在只有那些文件将使用Microsoft的语言扩展构建。

      vcxproj编辑没有问题(并且过滤器无法创建),不必设置文件来停止继承项目默认值,不要乱用/ Ze或/ Zc或任何手动命令行jimmying。我浪费的时间没有意识到这是多么简单。 > _<

      其他一些说明:感谢此处的建议并推动&拉各种杠杆,我发现了以下内容:

      • Visual C++ Team Blog上讨论的/ permissive-命令行选项(感谢Jodocus)显然可以满足我的需要。但是我发现它根本没有捕获一个匿名结构,所以也许我做错了但是它并没有强迫我的代码符合ISO C ++标准。

      • /Zc compiler options没有提到匿名结构,所以如果其中一个捕获了不符合要求的匿名结构,我就无法分辨出哪个。由于这是ISO C ++的一件事我无法明确涵盖,我也对这些旗帜失去了信心。

      • 如果违规文件是头文件,则必须为包含该头文件的每个源文件禁用该/ Za。

      • 最后,这也可以通过编程方式完成。请参阅DisableLanguageExtensions

答案 2 :(得分:1)

从技术上讲,这是将一些元数据分配给整组文件的方法,但是使用MSBuild在一个文件中忽略它:

foo

我不记得编译器设置/ Za将被分配给哪个,并且出于此说明的目的,它并不重要。关键是“商品”列表中的包含排除属性应排除并包含您要为特殊设置挑出的文件。请注意,在上一篇文章中,您正在查看的编译器设置不存在。