2

既存のC++マルチプロジェクトは、これまでのところQTでCMake2.8を使用しています。Visual Studio2010で引き続き維持したいと思います。オプションを使用してCMakeでVisualStudioプロジェクトを生成し-G "Visual Studio 10"ましたが、次の理由でコンパイルに失敗しました。

プロジェクトでは、よく知られているマクロを使用します。このマクロ自体は、たとえばこの質問で説明されています。

#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
  TypeName(const TypeName&);   \
  void operator=(const TypeName&)

マクロは、プリプロセッサ定義としてコンパイラ(cl.exe)に提供するために、CMakeで定義されます。

add_definitions(-DDISALLOW_COPY_AND_ASSIGN\(TypeName\)=\" TypeName(const TypeName&)\; void operator=(const TypeName&)\; \")

Visual Studioは、CMakeの出力を受け入れず、コードでマクロが使用されている場合は常にコンパイルエラーをスローします。CMakeがVisualStudio2010用に適切に生成できるようにするための適切な構文は何でしょうか?

4

2 に答える 2

2

cl のコマンド ラインで関数スタイルのマクロを定義することはできません。これを回避するには、ヘッダー ファイルにマクロを定義し、cl のコマンド ライン オプション /FI を使用してこのヘッダー ファイルを渡します。または、必要に応じて手動で含めるだけです(おそらくクリーンです)。

于 2012-12-07T16:45:19.627 に答える
2

一般的にはマクロを使用しないことをお勧めします。この場合は特にそうです。boost を使用できる場合は、非公開で から継承できますboost::noncopyable。そうでない場合は、独自に定義できます。

class noncopyable {
   noncopyable(noncopyable const &);
   void operator=(noncopyable const&);
protected:
   noncopyable();
};

class Use : noncopyable
{
...

どうしてもマクロを使用したい場合は、前処理されたコードをファイルにダンプするために必要なフラグの時点でコンパイラのドキュメントを読み、マクロの展開先を確認してください。そこから、何がうまくいかなかったのかを理解しようとすることができます。

于 2012-12-07T16:43:13.837 に答える