我希望能够在没有Microsoft的语言扩展恶作剧的情况下编译我的VS2017 C ++项目。
基于这里的回复/Za compiler directive does not compile system headers in VS2010,有没有办法让VS编译一个没有/ Za的文件,其余的用?
特别是不喜欢/ Za标志的文件是Winnt.h,我的几个文件正在使用它。
答案 0 :(得分:2)
编译器开关/ 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)
这比我意识到的要简单得多。
现在无论你添加什么新文件都会使用/ Za。
现在只有那些文件将使用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将被分配给哪个,并且出于此说明的目的,它并不重要。关键是“商品”列表中的包含和排除属性应排除并包含您要为特殊设置挑出的文件。请注意,在上一篇文章中,您正在查看的编译器设置不存在。