2009-07-15 73 views
0

請幫助宏初學者...我創建了一個簡單的宏來加載圖像並將其分成幾行,以便我可以記錄每次從宏生成的代碼執行(用於調試)。它看起來像這樣:宏中的註釋行

#define LOAD_PNG(L_I_IMAGE_NAME) ({ \ 
PngImageClass* __tmp; \ 
printf("Loading png: %s", L_I_IMAGE_NAME);\ 
__tmp = [image loading code here];\ 
__tmp; \ 
}) 

我的計劃是能夠很容易地註釋掉日誌行需要的時候,但預處理器將不會容忍任何的正常方式(手動)。應該怎麼做?!

編輯:我完全錯了,說它不工作「任何正常的方式」,因爲我一直懶到只嘗試單行評論。我還會聽取幾位響應者的建議,將其轉變爲一種功能。不,沒有什麼好的理由(我猜)爲此使用宏。

+4

有沒有原因,你使用宏而不是函數?這看起來不像一個宏,即使是一個好主意的地方。 – Eric 2009-07-15 12:01:57

回答

10

你可以這樣說:

#define LOAD_PNG(L_I_IMAGE_NAME) ({ \ 
PngImageClass* __tmp; \ 
/*printf("Loading png: %s", L_I_IMAGE_NAME);*/\ 
__tmp = [image loading code here];\ 
__tmp; \ 
}) 

的單行註釋//是行不通的,因爲你明確要求編譯器在年底提供一個反斜槓(\)繼續行每一行。

+0

註釋應該在行反斜槓結束之前停止;否則這些行將不會拼接在一起,並且它們不會全部包含在宏定義中。 (也就是說,第三行應該結束「*/\」而不是「\ * /」) – 2009-07-15 12:38:59

+0

你說得對,修正了。感謝您指出。 – Aamir 2009-07-15 12:41:43

2

因爲宏是一行(通過行延續),所以不能在其中使用'#if 0'或'//'式樣的註釋。/** /應該可以正常工作。

從你發佈的代碼片段看來,它看起來不應該是一個宏。僅當您以某種方式利用文本替換(例如,需要變量和變量的名稱)時才應使用宏。

1

爲什麼在宏陳述中有括號?一旦你解決了預處理器問題並且你肯定不需要它,這將不會被編譯。

+0

它編譯,但我不記得我爲什麼使用它們。它可能來自我複製過的一些宏,也可能是測試會話混淆造成的。不記得了。我會刪除括號:) – Felixyz 2009-07-15 13:00:07

0

除/ ... /樣式的註釋,你可以這樣做:

if (0) printf(...); 

一個更好的辦法是不使用宏,並把它變成一個函數來代替,不過,除非有一個真正重要的原因使用宏(但你沒有給出)。