【问题标题】:VS2010 Compiler defineVS2010 编译器定义
【发布时间】:2012-07-30 01:46:06
【问题描述】:

在 gcc 中,我正在写 friend class FriendMaker<T>::Type,但 Visual Studio 想要 friend FriendMaker<T>::Type。所以我认为是时候去编译特定的了。

那么我需要 ifdef 为 Visual Studio 做什么?我目前使用的是 2010,但以后可能会切换到 2012。

【问题讨论】:

    标签: c++ visual-studio conditional-compilation


    【解决方案1】:

    使用宏_MSC_VER。检查编译器是否为 VS2010 或以上版本:

    #if _MSC_VER >= 1600
    

    以下是不同版本VS的值:

    • VS 2003 (VC7.1): 1310
    • VS 2005 (VC8): 1400
    • VS 2008 (VC9): 1500
    • VS 2010 (VC10): 1600
    • VS 2012 (VC11): 1700

    【讨论】:

    • @NeelBasu,请参阅链接页面。这是微软的决定。
    • 那么我可以安全地使它成为1600 <= _MSC_VER 这样它还支持后面的版本吗?
    • 但最后一次编辑没有filter VS2010 and above 之前的编辑。
    • 没有问题我个人更喜欢_MSC_VER >= 1600,但作为答案作者使用了相反的问题。我在评论中提到过。
    • @NeelBasu,我最初在回答中使用了==。将文字(总是const)放在相等检查的左侧只是代码的一种习惯。
    【解决方案2】:

    只需对两个编译器都使用friend class ... 语法。 friend ... 语法,没有class 关键字,实际上是无效的; VS2010不抱怨是不对的。

    见this question。

    【讨论】:

    • 嗯。我刚刚用 Visual C++ 2010 Express 尝试了这个:class One { friend class Two; }; class Two { friend class One; }; int main() { One o1; Two o2; },它只是警告未使用的变量。你得到的错误信息到底是什么?
    【解决方案3】:

    我认为您需要使用以下代码进行交叉编译:

    template <typename T> class B;
    
    template <typename T>
    class A
    {
        friend typename B<T>::V;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多