0

私は C++ を初めて使用しますが、Java の経験はいくらかあります。

現在、xcode を使用して小さな C++ プロジェクトを作成しています。私は標準ライブラリを使用しました。次に、VS2010 でプロジェクトを作成します。プロジェクトのソースフォルダーの下に「既存のアイテム(xcodeプロジェクトの私のソースファイル)を追加」します。その後、プロジェクトはコンパイルできることがわかりましたが、VS2010 では正しく実行されませんでした。

C++ コードには移植性があると聞きましたが、xcode で実行されるコードが VS2010 で問題を引き起こす理由がわかりません。

私のソースコードでは、次のように書きます。

ああ:

  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 デバッガーは vector と p を正しく表示しますが、VS2010 内ではデバッガーは p と vector を正しく表示できません。ベクトルの見方を広げると、VS2010ではベクトルのサイズが非常に大きくなりますが、xcodeでのベクトルのサイズは正しいです。

Xcode C++ プロジェクトを VS2010 にインポートする方法はありますか? または、上記の問題を解決する方法はありますか?

4

1 に答える 1

1

C++ 標準では、整形式の C++ プログラムが提示されたときに特定の動作を生成する「抽象マシン」が定義されています。コンパイラは、抽象マシンのすべての動作を再現する必要はなく、「観察可能な動作」のみを再現する必要があります。

C++11 標準、§1.9/8:

準拠する実装の最小要件は次のとおりです。

  • volatile オブジェクトへのアクセスは、抽象マシンの規則に従って厳密に評価されます。
  • プログラムの終了時に、ファイルに書き込まれたすべてのデータは、抽象セマンティクスに従ってプログラムを実行した場合に生成される可能性のある結果の 1 つと同一でなければなりません。
  • 対話型デバイスの入力と出力のダイナミクスは、プログラムが入力を待つ前にプロンプ​​ト出力が実際に配信されるような方法で行われます。対話型デバイスを構成するものは実装定義です。

これらはまとめて、プログラムの観察可能な動作と呼ばれます。[: 抽象セマンティクスと実際のセマンティクスの間のより厳密な対応は、各実装によって定義される場合があります。—エンドノート]

「私の関数は常に実行時に呼び出される」は、これらの要件の1つではないことに注意してください。コンパイラは、観察可能な動作が標準で許可されているものと一致する限り、非常に積極的に最適化することが許可されています (実際、推奨されています)。コンパイラは、未定義の動作を引き起こさない整形式の C++ プログラムを作成したと見なすことができます。そうであると仮定すると、関数が観察可能な動作を持たず、一貫した値を返すことに気付いた場合、呼び出しを完全に省略したり、コンパイル時に値を計算したりできます。

VS の出力が壊れているかどうかは、

  • 最適化を無効にするかどうか (多くはデフォルトでオンになっていますが、ほとんどのコンパイラ (VC++ を含む) は、要求された場合に重要でないものを無効にします);
  • a::c()デバッガーの外部で実際に呼び出されるかどうか(一度も使用されない場合、コンパイラーはそれをバイナリーに含めない可能性さえあります)。
  • 観察可能な副作用を引き起こすかどうか;
  • 場合によっては、の内容、a::b()さらには呼び出し元の内容。
  • a::b()orの呼び出し前の任意の時点でプログラムの動作が定義されていないa::c()かどうか — 特に、a::b()ぶら下がりまたは不適切にキャストされたポインターまたは参照などを介して呼び出しているかどうか (プログラムがレールから外れると、すべての賭けオフです);

などなど。

vただし、VS でとの内容を表示できp、それらにガベージ値がある場合、問題はデバッガーやコンパイラーよりもコードにある可能性が高くなります。方法がわからない場合は、「これを表示できません」と簡単に言うことができます(.netオブジェクトで行うのが大好きです:P)。それができると思って、試して、間違っていたという事実は、むしろ物語っています.

于 2013-04-08T15:14:47.760 に答える