Xcode c++和VS2010 c++有什么不同?

What are the differences between Xcode c++ and VS2010 c++

本文关键字:c++ 什么 VS2010 Xcode      更新时间:2023-10-16

我对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和向量。如果我展开vector的视图,在VS2010中vector的大小会变得非常大,但是在xcode中vector的大小是正确的。

是否有办法导入Xcode c++项目VS2010?或者有什么方法可以解决上述问题?

c++标准定义了一个"抽象机器";当一个格式良好的c++程序出现时,它会产生某些行为。编译器不需要重现抽象机器的所有行为,只需要重现它的"可观察行为"。

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

一致性实现的最低要求是:

  • 对易失性对象的访问严格按照抽象机的规则求值。
  • 在程序终止时,写入文件的所有数据应与下列可能的结果之一相同
  • 交互设备的输入和输出动态应该以这样一种方式发生,即在程序等待输入之前实际交付提示输出。交互式设备是由实现定义的。
这些统称为程序的可观察行为。[:抽象语义和实际语义之间更严格的对应关系可以由每个实现定义。- 结束说明]

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

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

  • 是否禁用优化(许多优化在默认情况下是打开的,但大多数编译器-包括vc++ -如果被要求将禁用非必要的);
  • a::c()是否在调试器之外被实际调用(如果从未使用过,编译器甚至可能不会将其包含在二进制文件中);
  • 是否引起任何可观察到的副作用;
  • 在某些情况下,a::b()的内容,甚至呼叫方的内容;
  • 程序的行为是否在可能调用a::b()a::c()之前的任何点未定义-特别是,您是否通过悬空或不正确转换的指针或引用调用a::b()等(一旦程序偏离轨道,所有赌注都将取消);

和其他一些东西

我会说,虽然:如果VS允许您查看vp的内容,并且它们有垃圾值,那么问题更可能是代码而不是调试器或编译器。它可以很容易地说"i can't display this";(就像它喜欢处理。net对象一样:P)如果它不知道怎么做的话。它认为自己可以,尝试过,但却错了,这一事实很能说明问题。