2012-11-15 19 views
1

下面的宏會帶來問題嗎?下面的宏可能會給應用程序帶來什麼問題?

#define sq(x) x*x 

如果是,那麼爲什麼?請幫助。

+4

副作用!你需要額外的'(',')'。 –

+2

你有什麼嘗試?你的課本建議什麼?你的課程導師在他的演講中提出了什麼建議? –

+0

這是一個開放式問題type.just提出了這個問題。 –

回答

9

是的,它可能會出現問題。除了顯而易見的事實,宏完全不考慮命名空間(這意味着你不能叫別的sq),請嘗試以下操作:

int result = sq(4)/sq(4); 

您應環繞x * x用括號,使其成爲((x) * (x))

另一個問題:

int a = 0; 
int result = sq(++a); 

這與宏的固有問題,並且是一個原因,內聯函數應該是首選。

1

所有這些都造成麻煩:

int x = 12; 
int n = sq(x+3); 
int y = sq(x++); 
int z = 2 * sq(2 + n) * n; 

與功能sq comparared。

1

其一,運算符優先級將被搞砸了:

sq(2+2); // author wants 4*4, but gets 2+2*2+2. 
2

正如指出的那樣,你應該包裝在每次使用括號內的參數,以確保正確的行爲,例如,當參數是一樣的東西i * 2

#define sq(x) ((x)*(x)) 

但還有另一個潛在的問題。考慮以下幾點:

result = sq(++i); 

這被翻譯成:

result = ((++i)*(++i)) 

凡用心很可能會增加i只有一次,它就會增加兩倍。這是宏的常見副作用。

一種方法是在調用它時注意到這一點,但更好的方法是將sq()置於其自己的內聯函數中。

+0

哎呀,是的。抱歉。 –

4

我不會給你一個直接的答案(這看起來像一個家庭作業問題),但我會給你一個例子,希望能讓你思考並提出一個正確的答案:

#include <iostream> 

#define sq_macro(x) x * x 

int sq_function(int x) 
{ 
    return x * x; 
} 

int print_and_ret(int x) 
{ 
    std::cout << x << '\n'; 
    return x; 
} 

int main() 
{ 
    std::cout << "Calling sq_macro:\n"; 
    sq_macro(print_and_ret(10)); 

    std::cout << "Calling sq_function:\n"; 
    sq_function(print_and_ret(10)); 
} 

當您運行程序時,宏和函數會給出兩種不同的行爲。想一想宏是什麼,以及一個函數是什麼。

+0

很多人在低垂的水果之後 - 爲了讓他覺得+1 +1) – Caribou

+0

@Caribou是的,當按下按鈕時,已經有大量的答案,嘿。 –

3

寫入宏時過度使用括號。重寫宏如下

#define sq(x) ((x)*(x)) 

如果你不這樣做,那麼其中的宏作爲sq(5+4)

要理解這個問題做宏展開,看看你將在案件的問題。