0

C で関数マクロを定義するためにプリプロセッサ ディレクティブを使用しています。関数マクロに複数の if/else if ステートメントを含めることはできますか?

はいの場合、どのように書きますか?

#define WRITE(str,id) #str(id)

// HERES where I am having difficulty
#define DRAW_GENERIC_WINDOW(windowID, type) if type==1 WRITE(draw_text,windowID) else if type==2 WRITE(draw_image,windowID) else if type==3 WRITE(draw_hyperlink,windowID)

// usage
DRAW_GENERIC_WINDOW(112, 1);
DRAW_GENERIC_WINDOW(178, 2);
DRAW_GENERIC_WINDOW(988, 3);

// At compile time the above should be converted to...
draw_text(112);
draw_image(178);
draw_hyperlink(988);

関数マクロで単一の if else ステートメントを実行する方法は知っていますが、複数の if/else if で実行する方法は知りません。

// if else eg
#define DRAW_GENERIC_WINDOW(windowID, type) ((type)==(1))?WRITE(draw_text,windowID):WRITE(draw_image,windowID)

注: 「どうしてこんなプログラミングをしているの?」と尋ねる前に。:P 構造体、ポインター、または新しいデータ型を宣言する機能がないことを除いて、4dm と呼ばれる C に非常に似た言語で書いているためです。そのため、何らかの形式の仮想機能を実現するために、プリプロセッサ ディレクティブに頼らざるを得ません (使用しているウィンドウの種類 (画像、ハイパーリンクなど) がわからない場合に使用されます)。

4

2 に答える 2

3

このように試してみてください:

#define WRITE(str,id) str(id)

// HERES where I am having difficulty
#define DRAW_GENERIC_WINDOW(windowID, type) if (type==1) \
WRITE(draw_text,windowID) \
else if (type==2) \
WRITE(draw_image,windowID) \
else if (type==3) \
WRITE(draw_hyperlink,windowID)

// usage
DRAW_GENERIC_WINDOW(112, 1);
DRAW_GENERIC_WINDOW(178, 2);
DRAW_GENERIC_WINDOW(988, 3);
于 2012-10-01T02:37:49.993 に答える
1

次のように、トークンの貼り付け演算子##を基本的なパターン マッチングとして使用するだけです。

#define DRAW_GENERIC_WINDOW(windowID, type) DRAW_GENERIC_WINDOW_ ## type(windowID)

#define DRAW_GENERIC_WINDOW_1 draw_text
#define DRAW_GENERIC_WINDOW_2 draw_image
#define DRAW_GENERIC_WINDOW_3 draw_hyperlink

次に、次のように使用します。

DRAW_GENERIC_WINDOW(112, 1); // expands to draw_text(112, 1);
DRAW_GENERIC_WINDOW(178, 2); // expands to draw_image(178);
DRAW_GENERIC_WINDOW(988, 3); // expands to draw_hyperlink(988);
于 2012-10-01T15:11:57.660 に答える