回答
是的,它可能會出現問題。除了顯而易見的事實,宏完全不考慮命名空間(這意味着你不能叫別的sq
),請嘗試以下操作:
int result = sq(4)/sq(4);
您應環繞x * x
用括號,使其成爲((x) * (x))
。
另一個問題:
int a = 0;
int result = sq(++a);
這與宏的固有問題,並且是一個原因,內聯函數應該是首選。
所有這些都造成麻煩:
int x = 12;
int n = sq(x+3);
int y = sq(x++);
int z = 2 * sq(2 + n) * n;
與功能sq
comparared。
其一,運算符優先級將被搞砸了:
sq(2+2); // author wants 4*4, but gets 2+2*2+2.
正如指出的那樣,你應該包裝在每次使用括號內的參數,以確保正確的行爲,例如,當參數是一樣的東西i * 2
:
#define sq(x) ((x)*(x))
但還有另一個潛在的問題。考慮以下幾點:
result = sq(++i);
這被翻譯成:
result = ((++i)*(++i))
凡用心很可能會增加i
只有一次,它就會增加兩倍。這是宏的常見副作用。
一種方法是在調用它時注意到這一點,但更好的方法是將sq()
置於其自己的內聯函數中。
哎呀,是的。抱歉。 –
我不會給你一個直接的答案(這看起來像一個家庭作業問題),但我會給你一個例子,希望能讓你思考並提出一個正確的答案:
#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));
}
當您運行程序時,宏和函數會給出兩種不同的行爲。想一想宏是什麼,以及一個函數是什麼。
很多人在低垂的水果之後 - 爲了讓他覺得+1 +1) – Caribou
@Caribou是的,當按下按鈕時,已經有大量的答案,嘿。 –
寫入宏時過度使用括號。重寫宏如下
#define sq(x) ((x)*(x))
如果你不這樣做,那麼其中的宏作爲sq(5+4)
要理解這個問題做宏展開,看看你將在案件的問題。
- 1. 下面的程序有什麼問題
- 2. 下面的決策表可能會有什麼問題?
- 3. rapidminer中的KNN爲什麼會給內存帶來問題?
- 4. 下面的宏可用於什麼?
- 5. 什麼可能導致共享Android應用程序的問題?
- 6. 以下宏用法有什麼問題?
- 7. 這可能會出現什麼問題?
- 8. 給perfmon帶來的問題
- 9. 什麼可能會減慢我的Flex移動應用程序?
- 10. 下一步要做什麼來構建桌面應用程序?
- 11. 使用Webview/javascript的Android應用程序。什麼可能是安全問題?
- 12. GeoFire給CocoaPods帶來問題
- 13. Jmeter給xpath帶來問題
- 14. 下面的C++程序有什麼問題?
- 15. Android應用程序的當前活動帶來正面的問題
- 16. 以下Tkinter程序有什麼問題?
- 17. 以下程序有什麼問題?
- 18. 以下pthread程序有什麼問題?
- 19. 爲什麼內核模式給STL帶來問題?
- 20. 爲什麼下面提到的程序不會給出空引用異常?
- 21. 爲什麼以下程序可能會掛起?
- 22. 下面給出的insert.php有什麼問題嗎?
- 23. 可能的Web應用程序數據庫性能問題
- 24. 下面的代碼有什麼問題?
- 25. 下面的代碼有什麼問題?
- 26. 下面的代碼有什麼問題?
- 27. 下面的代碼有什麼問題?
- 28. Android應用程序問題將主要活動帶到前面
- 29. 面對以下問題當提交應用程序到應用程序商店
- 30. 什麼是!在下面的宏中呢?
副作用!你需要額外的'(',')'。 –
你有什麼嘗試?你的課本建議什麼?你的課程導師在他的演講中提出了什麼建議? –
這是一個開放式問題type.just提出了這個問題。 –