【问题标题】:How to set more strict compiling rules in VC when compile C++ template code编译C++模板代码时如何在VC中设置更严格的编译规则
【发布时间】:2011-03-30 02:23:58
【问题描述】:

伙计们, 我希望 VC 在编译 c++ 模板代码时具有与 GCC 相同的严格编译规则。但我不知道如何在我的 VC9.0 (Visual Studio 2008) 中设置它。

例如, GCC 中不允许使用以下代码。

AutoPtr<RefCounted<Shape>> shape;

因为这里不允许使用“>>”,而且 gcc 要求在“>>”之间至少添加一个空格。

AutoPtr< RefCounted<Shape> > shape;

VC 不会将此视为错误。据我了解,VC对模板代码编译的限制比较宽松。

如何在 VC 中添加更多限制以使其规则与 GCC 相同?

【问题讨论】:

    标签: c++ templates visual-c++ metaprogramming visual-c++-2008


    【解决方案1】:

    你没有。 :( MSVC++ 只是不正确地处理模板,你必须小心。


    请注意,您的特定示例实际上并不是 C++0x 中的错误,因此 MSVC2010 实际上接受它是正确的。 (虽然它在很多其他方面仍然是错误的,但它变得更好了。)

    您甚至可以“作弊”并为您的 gcc 编译启用 C++0x 以允许它;请确保不要意外使用 MSVC2008(或 MSVC2010!)无法支持的 C++0x 内容。

    【讨论】:

    • 如果我想写一个可移植的代码,我觉得很不方便,因为当我在gcc中编译代码时,它有很多错误,VC没有将其视为错误。我的主编是VC。
    • @giggle:我完全明白你的意思,我也一样。这是非常不幸的;把它变成一个测试自己模板知识的机会。 ;)
    【解决方案2】:

    我不会真的把它称为错误——C++0x 已经解除了这个限制,所以我会习惯它。更重要的是,Visual Studio 非常乐意接受与 C++03 兼容且中间有空格的括号,所以我只是使用它并忘记它。没有办法改变 Visual Studio 的解析器不符合标准中规定的事实,这是它不符合标准的最不重要的方式。

    【讨论】:

    • 没有办法让它完全合规,但/Za 有帮助。
    • 更高的警告级别也是如此,/W4。
    【解决方案3】:

    【讨论】:

    • 不幸的是,MSVC 对模板的处理只是错误的,而不是扩展。 (它在最基本的层面上失败了:它不进行两阶段查找。)
    • @GMan:是的。该问题询问“与 gcc 相同的规则”,这是不可能的,但标题提到“更严格”,/Za/Ze 更严格。
    【解决方案4】:

    我非常不同意 GMan 的说法:“MSVC++ 只是错误地处理了模板”。相反,我会说 MSVC 和 GCC 都错误地处理模板,每个都以自己的方式:)

    为了处理编译器细节,维护一组编译时测试模块是值得的。此外,现代构建系统(例如 bjam)可以配置为在项目编译后立即运行简短的单元测试。因此,您所要做的就是不时使用 gcc 工具集(和/或在非 Windows 平台上)构建您的项目,以确保一切按预期工作。

    PS。否决票不是我的:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      相关资源
      最近更新 更多