2

私はカフェのソースコードを読んでいました。tools/caffe のソースである caffe.cpp で、私を困惑させる次のコードに遭遇します。

#define RegisterBrewFunction(func) \
namespace { \
class __Registerer_##func { \
 public: /* NOLINT */ \
  __Registerer_##func() { \
    g_brew_map[#func] = &func; \
  } \
}; \
__Registerer_##func g_registerer_##func; \
}

私の知る限りでは、このマクロは RegisterBrewFunction(func) を無名クラスに置き換え、<#func, &func> を g_brew_map に追加するだけです。では、なぜこれをこのようにしないのですか?

#define RegisterBrewFunction(func) g_brew_map[#func]=&func;

誰かがこれについて私を助けてくれることを願っています。

4

2 に答える 2

0

#define関数内で使用できるマクロを定義します。コードがこの関数に到達すると、マクロ引数が登録されます。コーヒーを淹れるための関数を呼び出す必要があります。

オリジナル#defineは、ファイル スコープで使用されるマクロを定義します。多かれ少なかれ匿名のオブジェクトを作成します。そのオブジェクトのクラスのコンストラクターはmain、関数が呼び出されて登録される前に実行されます。他に必要な機能はありません。

于 2014-12-29T14:40:09.110 に答える