2012-11-15 36 views
0

我讀到這裏的#define宏被犯了這樣的一篇文章#define語句:嵌入式如果宏觀

#define TEST(level) if (level > 2) ; else std::cout 

,然後可以在代碼中使用這樣的:

Test(1) << 3; 
Test(3) << 4; 

我的印象是,如果你寫

TEST(1) 

,將其替換爲下:

std::cout 

TEST(3) 

將與空字符串(在代碼文件中)來代替。但是,如果它以這種方式工作,那麼它應該拋出一個錯誤,因爲

<< 3; 

無效。

這個宏如何實際工作?以及如何預處理器變化

TEST(3) << 3; 

,使其無法正常輸出(即,代碼不運行)

+1

預處理是文本替換。整個if-else被替換。 – chris

回答

5

我相信你聽錯了:

對於TEST(3) << 3,被替換的形式是:

if (3 > 2) ; else std::cout << 3 

它仍然是有效的表達式

1

它取代了TEST(x);

if (x > 2) 
    // do nothing 
else 
    std::cout << x 

預處理取代所有的文字,這意味着你得到整個的if-else

這也可以被寫爲

#define TEST(x) if (!x > 2) std::cout 
+0

這個宏不包括'<< x' – jpm

+0

沒錯,那是愚蠢的我。編輯。 – evanmcdonnal