0

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

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

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

在我的源代码中,我写了如下内容:

啊:

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

一个.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?或者有什么方法可以解决上述问题?

4

1 回答 1

1

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

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

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

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

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

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

VS的输出是否坏了,很大程度上取决于

  • 优化是否被禁用(许多优化是默认开启的,但大多数编译器——包括 VC++——会在询问时禁用非必要的);
  • 是否a::c()在调试器之外实际调用过(如果从未使用过,编译器甚至可能不会将其包含在二进制文件中);
  • 是否会引起任何可观察到的副作用;
  • 在某些情况下,调用者的内容a::b(),甚至调用者的内容;
  • 程序的行为是否在潜在调用之前的任何时候都未定义,a::b()或者a::c()- 特别是,您是否a::b()通过悬空或不正确转换的指针或引用等进行调用(一旦程序运行异常,所有赌注关闭);

和一堆其他的东西。

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

于 2013-04-08T15:14:47.760 回答