2011-06-20 50 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語言中,至少沒有輸入宏參數。這全是符號替換。只需使用pReporter而不是Reporter * pReporterReporter 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); 

或者你可以自動執行它,就像ncurses'getyx()作用:

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

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

希望它能幫助, ief2

3

作爲申訴委員會指出,宏比函數不同,他們並不需要的參數的類型

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