0

VS2012 でプリコンパイル済みヘッダーを使用する Qt プロジェクトがあり (それが関連しているかどうかは不明)、コンパイルして正常に動作します。しかし、QtCreator で同じプロジェクトをコンパイルしようとすると、エラーが表示されます。まず第一に、両方のプロジェクトは互いに対応しており、以前は正しく構成されていました (コンパイルして正常に動作しました)。しかし、コードへの最新の変更の後、何かがうまくいきませんでした。

エラー:

pch.h:34: error:C2084: function 'void handleExceptionByShowingMessage(std::exception &)' already has a body
main.cpp:16: error:C3861: 'handleExceptionByShowingMessage': identifier not found

これらは、pch.h (インラインも) で定義された別の関数といくつかの cpp ファイルで 30 行以上続きます。しかし、すべてのエラーは類推的です。

からpch.h:

inline void handleExceptionByShowingMessage(std::exception &e)
{
    QMessageBox msgBox;
    msgBox.setText(QString::fromUtf16((ushort*)e.what()));
    msgBox.setStandardButtons(QMessageBox::Discard);
    msgBox.setIcon(QMessageBox::Warning);
    int ret = msgBox.exec();
}

cpp通常の使用であるため、ファイルからの関数呼び出しは貼り付けません。すべてのcppファイルがpch.h正しく (コードの最初の行) 含まれており、私が言ったように、まったく同じコードとファイル構造が VS2012 で機能します (そのコンパイラは、QtCreator が実際に使用していると思います...)。

さらにコード/情報が必要な場合はお知らせください。

更新: はい、すべてのヘッダーに#pragma once. 興味深いことに、これら 2 つの関数定義をダミーのヘッダー ファイルに移動して に含めるとpch.h、プロジェクトは正常にコンパイルされました。

4

2 に答える 2

2

#pragma onceディレクティブを含むファイルが複数回含まれないようにするだけです。プリコンパイル済みヘッダー ファイル はpch.h、プリコンパイル済みヘッダーが読み込まれるときにインクルードされ、2 回目はファイルがコンパイルされるときにインクルードされます。ディレクティブはそれらを個別の#pragmaファイルと見なすため、このコンテキストでは機能しません。

pch.hファイル (または)は最適化されており、理想的にはソース コードを含めず、他のヘッダー ファイルstdafx.hのみに含める必要があります。#includesそうすれば、何度も含めても問題ありません。

別の解決策として、インクルード ガード ( #ifndef PCH #define PCH #endif) を使用すると、ファイルが何度もインクルードされるのを防ぐことができます。

于 2013-06-04T16:19:44.727 に答える
1

static inlineコードがヘッダーにある場合は試してみてください。inlineなぜ意味しないのかわかりませんstaticが、私もこれについて少し前につまずきました。

于 2013-06-04T14:36:30.370 に答える