3

最近、単純なソースをコンパイルしたくないという奇妙な問題に直面しました。私は多くのサイトで解決策(および原因)を探していましたが、良い効果はありませんでした(バグレポートを除くが、直接の原因は見つかりませんでした).

以下に、その状況を再現するための簡単なコードを示します。

struct Foo {
  Foo() : m_x( true ) {}
  __property bool x = { read=m_x };

  private:
    bool m_x;
};

template<typename T>
struct TMyPointer {
  T * m_ptr;
  TMyPointer( T * ptr ) : m_ptr( ptr ) {}
  ~TMyPointer()
  {
    delete m_ptr;
  }

  T * operator->() const
  {
    return Get();
  }

  T * Get() const
  {
    if( m_ptr == NULL )
      ; // some error handling

    return m_ptr;
  }
};

int _tmain(int argc, _TCHAR* argv[])
{
  TMyPointer<Foo> bar( new Foo );

  if( bar->x && 1 == 1 ) ; // Failed
  if( 1 == 1 && bar->x ) ; // OK
  if( !!bar->x && 1 == 1 ) ; // OK
  if( bar->x == true && 1 == 1 ) ; // OK
  if( (bar->x) && 1 == 1 ) ; // OK

  return 0;
}

コンパイラは、メイン関数内の最初の条件をコンパイルできませんでした。他の同等の条件の奇妙なコンパイルが正常に終了しました。

これは、リリースのコンパイル中にのみ行う動作です。再現するために、Embarcadero® C++Builder® XE5 バージョン 19.0.13476.4176 を使用しました

エラー メッセージ: [bcc32 致命的なエラー] File1.cpp(43): F1004 ベース 0x14410000 の 0x14470090 で内部コンパイラ エラーが発生しました

上記の例で何が問題なのか誰でも知っていますか? プロパティメカニズムを備えた使用テンプレートが原因でしょうか?

4

3 に答える 3

1

私の場合は単純な解決策ですが、Get メソッド内の問題があるようです。私が変わるとき

if( m_ptr == NULL )

同等の形に

if( !m_ptr )

すべてがエラーなしでコンパイルされます。

私の洞察を共有したいので、ここでそれについて書いています-それは誰かにとって役立つかもしれません.

于 2015-05-05T03:51:45.517 に答える
0

最近、私は同様のICEを取得しました(ソースコードのサイズが大きくなると)、あなたのソリューションはしばらくの間役に立ったように見えましたが、コードICEのいくつかの小さな変更が再び浮上した後、実際にはそうではありませんでした. 私の問題の動作に基づいて:

  • IDE: BDS2006 Turbo C++ エクスプローラー (BCB6 と RAD の間の BCB のバージョン)
  • 巨大な win32 プロジェクト (USB、OpenGL、CAD/CAM を含む数 MB のコード)
  • コードの各部分は何年にもわたってテストされており、それらが一緒になってコードが大きくなりすぎると、コンパイル可能で別々に問題が発生します
  • プロジェクトは最初の実行時に正常にコンパイルされますが、その後は再コンパイルに失敗します

一時的な回避策は、IDE を閉じ、すべての obj、tds、exe、... ファイルを削除し、IDE を再起動して再度コンパイルすることでした。

私は、コンパイラや IDE がリークしたり、それ自体の一部を上書きしたりして、その機能を破壊していると想定しました。一時ファイルを削除せずにIDEを再起動した後も問題が解決しないため、一時ファイルに保存されているデバッグ情報に関係があると思いました。

だから私はこれで遊んでProject->Options->Debugging settingsオフにしました:

  • インライン関数展開 (-vi)

役に立ちました(IDEの再起動や一時ファイルの削除さえ必要ありませんでした)。

于 2022-02-24T09:55:11.433 に答える