1

C++/Qt プロジェクトで高度な C++11 機能を使用する場合、QtCreator にはコード モデルにいくつかの問題があります。私の場合: 次のようにテンプレート化されたエイリアス:

template<class T> using Ptr = QSharedPointer<T>;

QSharedPointer<SomeClass> myPtr = ...;
myPtr->...                               // will complete

Ptr<SomeClass> myPtr = ...;              // not even parsed as a type...
myPtr->...                               // won't complete

そこで、QtCreator がファイルを解析するときにPtr自分の定義をマクロ ハッキングすることを考えましたが、もちろん、コンパイラがファイルを解析するときはテンプレート化された素敵なエイリアス構文を使用します。何かのようなもの:

#ifdef QT_CREATOR
# define Ptr QSharedPointer
#else
template<class T> using Ptr = QSharedPointer<T>;
#endif

QtCreatorはコードモデルでそれらを使用するのに十分スマートであるため、を使用して.proファイルにマクロ定義を配置しても機能しDEFINES += -D...ません(もちろん、これは素晴らしいことです)。また、QMAKE_CXXFLAGS += -D...正しく解析されています (悲しいことに)。

QtCreator にマクロが定義されているが (コンパイラの場合) マクロが定義されていない (またはその逆) ことを「だます」にはどうすればよいですか?

PS: 私は最新バージョン (2.7) を使用しており、2.6 も試しました。

4

1 に答える 1

1

以下は、マクロ定義についてQtCreatorをだますために機能しました。

.pro プロジェクト ファイルに、次の行を追加しました。

QMAKE_CXX = $${QMAKE_CXX} -D_IS_BEING_COMPILED

つまり、マクロ_IS_BEING_COMPILEDが定義されます。しかし、QtCreator (少なくともバージョン 2.7) はQMAKE_CXXfor フラグの内容を解析しません (正当な理由があると思います)。そのため、QtCreator はこのマクロを認識しませんが、コンパイル時には存在します。したがって、次のようなプリプロセッサ ブランチが機能します。

#ifdef _IS_BEING_COMPILED
template<class T> using Ptr = QSharedPointer<T>;
#else
# define Ptr QSharedPointer
# error `Ptr` is a macro, but it should not!
#endif

現在、QtCreator はマクロの回避策を使用してエイリアスを導入していますが、これは完全ではありませんが、ハッキングされているのは IDE だけであり、コード ベース自体ではないため、これで問題ありません。PtrQtCreator はnow のインスタンスと完全なメンバーを解析します。

于 2013-03-28T19:28:31.643 に答える