Xcode c ++和VS2010 c ++之间有什么区别

时间:2013-04-08 13:52:31

标签: c++ visual-studio-2010

我对C ++很陌生,我有一些java经验。

目前我使用xcode编写一个小型c ++项目。我刚刚使用了标准库。然后我在VS2010中创建了一个项目。我“在项目的源文件夹下添加现有项目(我在xcode项目中的源文件)”。之后,我发现该项目可以编译但在VS2010中无法正常运行。

我听说c ++代码具有可移植性,我不明白为什么在xcode上运行的代码会导致VS2010出现问题。

在我的源代码中,我写了类似的内容:

A.H:

  class a{
    public :
     int p ; 
    vector<Token*> v;
    a();
    int b();
    void c();
 }

a.cpp:

   a::a(){ //constructor of a
      p = 0;
      v.push_back(new Token("a",1));
   }
   int a::b(){
        ......
        //breakpoint to view p, v 
    c();
   }
   void a::c(){
        .......
       // when I set breakpoint here, in xcode, the debugger stops here.
       // in VS2010, it said the debugger did not hit this breakpoint.
   }

在运行时,xcode调试器正确显示向量和p,但在VS2010内部,调试器无法正确显示p和向量。如果我展开矢量视图,在VS2010中矢量的大小变得非常大,但xcode中的矢量大小是正确的。

有没有办法将Xcode C ++项目导入VS2010?或者任何解决上述问题的方法?

1 个答案:

答案 0 :(得分:1)

C ++标准定义了一个“抽象机器”,它在呈现格式良好的C ++程序时会产生某些行为。编译器不需要重现抽象机器的所有行为,只需要重现其“可观察的行为”。

C ++ 11标准,§1.9/ 8:

  

符合实施的最低要求是:

     
      
  • 严格按照抽象机的规则评估对volatile对象的访问。
  •   
  • 在程序终止时,写入文件的所有数据应与其中一个可能的结果相同   根据抽象语义执行程序会产生。
  •   
  • 交互式设备的输入和输出动态应以在程序等待输入之前提示输出实际传送的方式进行。构成交互设备的是实现定义。
  •   
     

这些统称为程序的可观察行为。 [注意:每个实现可以定义抽象语义和实际语义之间更严格的对应关系。 - 结束记录]

注意,“我的函数将始终在运行时调用”不是这些要求之一。只要可观察行为与标准允许的行为相匹配,就允许(实际上鼓励)编译器非常积极地进行优化。允许编译器假设您编写了一个格式良好的C ++程序,该程序不会导致未定义的行为。假设它这样做,如果它注意到一个函数没有可观察行为并且将返回一致的值,则允许完全省略该调用,在编译时计算该值等等。

VS的输出是否被打破在很大程度上取决于

  • 是否禁用了优化(默认情况下许多都已启用,但大多数编译器 - 包括VC ++ - 如果被要求将禁用非必要的编译器);
  • 是否在调试器之外实际调用a::c()(如果它从未使用过,编译器甚至可能不会将它包含在二进制文件中);
  • 是否会引起任何可观察到的副作用;
  • 在某些情况下,a::b()的内容,甚至是来电者的内容;
  • 在调用a::b()a::c()之前的任何时间点,程序的行为是否未定义 - 特别是,您是通过悬空还是不正当地呼叫a::b() - 指针或参考等(一旦程序离开轨道,所有投注都关闭);

以及其他一些事情。

我会说,但是:如果VS允许您查看vp的内容,并且它们具有垃圾值,那么问题更可能是代码而不是调试器或编译器。它可以很容易地说“我不能显示这个”(因为它喜欢用.net对象:P)如果它不知道如何。它认为可能,尝试过,并且错误的事实是相当有说服力的。