4

Google のすべてのリファレンスは簡単な例のみを示しています。コードには次のようなケースがあります。

#define XHANDLER(A,B,H) X_TO_BUS_HANDLER(A,B,H) X_FROM_BUS_HANDLER(A,B,H)

namespace{
   X_TO_BUS_HANDLER( some::SomeClassX,
                     bus::SomeBus,
                     foo::SomeHandler );

この定義がどのように機能するか知っている人はいますか? 1 つのパターンと 2 つのトークン リスト?参考にしてください。

コードを egrepED しましたが、X_TO_BUS_HANDLER が使用されていることがわかりました。

4

3 に答える 3

6

これは、他の定義と同じように機能します。プリプロセッサが に遭遇するたびに、XHANDLERそれをX_TO_BUS_HANDLER(A,B,H) X_FROM_BUS_HANDLER(A,B,H)(およびパラメータ) に置き換えます。

あなたのスニペットでは、マクロは使用されていません。

しかし、何かのような

XHANDLER(some::SomeClassX, bus::SomeBus, foo::SomeHandler) 

と同等です

X_TO_BUS_HANDLER(some::SomeClassX, bus::SomeBus, foo::SomeHandler) X_FROM_BUS_HANDLER(some::SomeClassX, bus::SomeBus, foo::SomeHandler)
于 2012-11-22T14:05:42.690 に答える
5

プリプロセッサは単にマクロを本体に置き換えるだけであることを思い出してください。というわけでマクロの使い方

XHANDLER(a, b, c)

単にテキストに置き換えられます

X_TO_BUS_HANDLER(a, b, c) X_FROM_BUS_HANDLER(a, b, c)
于 2012-11-22T14:05:45.487 に答える
2

C/C++ プリプロセッサは、同じ行に記述されているすべてのパターンを置き換えます。あなたの場合、そのパターンの後の2つのトークンはそれ自体がマクロであるように見えるため、それらも展開されます。

いくつかの例:

#define F(x, y) x f(y yParam);
#define G(x, y) y g(x xParam);
#define FG(x, y) F(x, y) G(x, y);

FG(int, double)

//this is the same as:
int f(double yParam);
double g(int xParam);

あなたの場合、2つの定義 X_FROM_... と X_TO_... が、それぞれバスからまたはバスに X を渡すためのハンドラーである関数またはクラスを作成すると思います。XHANDLER マクロは、双方向のハンドラーを作成します

于 2012-11-22T14:18:14.073 に答える