2011-06-20 2 views
0

現在、コンパイラフラグに基づいて関数を定義しようとしています。 TRACEフラグが設定されている場合は、情報をトレースコンポーネントに渡すマクロを定義します。マクロパラメータリスト内のポインタ

#define TRACERPTR(Reporter * pReporter, traceComponent eComponent, traceLevel eLevel, string sFormat, formatArgs...) \ 
if (pReporter != NULL) { pReporter->trace(eComponent, eLevel, sFormat, ##formatArgs); } 

Reporterは、このマクロの上に同じ.hファイルで定義されたクラスです。レポータオブジェクトのポインタを渡す必要があります。レポータオブジェクトは、トレース機能の呼び出しに使用されます。

しかし、私はコンパイラエラーを取得:

error: "*" may not appear in macro parameter list

私はちょうど「*」を削除した場合に生じるものになど興味があった - 「マクロのパラメータは、カンマ区切りでなければならないエラーが発生しました"

ここで間違っていることはありますか?

答えて

9

私の知る限り、Cでは、少なくとも、マクロパラメータは入力されません。それはすべてのシンボル置換です。 Reporter * pReporterまたはReporter pReporterではなく、pReporterを使用してください。

は(同じことが、私が思う、あなたのマクロの他のパラメータに適用されます。)

+1

あなたの知識が正しい引数の種類を必要としない、ので、あなたのソリューションです。 –

+0

最初に対応して、あなたの知識は正しいです。ありがとう。 – BSchlinker

+0

@ BSchlinker:どうぞよろしくお願いいたします。 – JAB

-1

はちょうどあなたの呼び出しで&マークを配置します。

#define SCAN_INT(str, myInt) (sscanf(str, "%d", myInt)) 

const char *myString = "23"; 
int myInteger; 
SCAN_INT(myString, &myInteger); 

それともncursesgetyx()のように、それを自動化することができますい:それは助け

#define SCAN_INT(str, myInt) (sscanf(str, "%d", &myInt)) 

const char *myString = "23"; 
int myInteger; 
SCAN_INT(myString, myInteger); 

希望、 IEF2

JABが指摘したように、マクロは関数とは異なります
3

は、彼らが

#define TRACERPTR(pReporter, eComponent, eLevel, sFormat, formatArgs...) \ 
if (pReporter != NULL) { pReporter->trace(eComponent, eLevel, sFormat, ##formatArgs); } 
関連する問題