2016-06-23 98 views
1

我有一個函數在屏幕上顯示一個字符串。原型是dispStrFont(char* str, struct Font font, int x, int y, int color)C:連續的宏不起作用

但是,由於輸入字體很煩人,我做了一個宏#define dispStr(str, x, y, color) dispStrFont(str, normal_font, x, y, color)。編譯時似乎工作正常(沒有錯誤)。

我的大部分琴絃都是黑色的,所以沒有必要輸入顏色。所以我使用另一個宏(放置在上面的宏之前)使顏色可選:#define dispStr(str, x, y) dispStr(str, x, y, 0)

這兩個宏的組合給出錯誤,我不知道爲什麼。

頭文件

#define dispStr(str, x, y) dispStr(str, x, y, 0) 
#define dispStr(str, x, y, color) dispStrFont(str, normal_font, x, y, color) 
//the define above gives me a warning: "Incompatible redefinition of macro "dispStr" (declared at line 1)" 

主文件:

dispStr("test", x, y) //gives me an error, saying there's an illegal token ')' 
         //also gives me a warning "Too few arguments in macro invocation" 
dispStr("test", x, y, 0) //compiles fine 

爲什麼它的行爲呀?此外,當我評論第二個定義時,它不會給我那個括號錯誤(但由於它不識別dispStr函數而不能明顯編譯),所以它是dispStr(str, x, y)上導致錯誤的連續定義。

編輯:最後修改宏以刪除不必要的組合。所以define dispStr(str, x, y) dispStr(str, x, y, 0)變成define dispStr(str, x, y) dispStrFont(str, normal_font, x, y, 0)。我也必須把這個定義放在另一個之後,否則它由於某種原因仍然給我括號錯誤。

+0

您是否嘗試切換訂單? –

+0

如果我切換定義,它不起作用,因爲'dispStr(str,x,y)'被替換爲'dispStr(str,x,y,0)',但沒有被替換爲'dispStrFont'。 – Zezombye

+0

哦,對。對不起,我有一個腦袋。 –

回答

7

您不能重載宏。此外,如果已經調用宏,則不會再次調用它。

您應該爲您的宏指定不同的名稱。您也可以使用variadic macro作爲GNU擴展,並在C99之後。