我可以將默認參數設置爲#defined值嗎?C++使用#define設置默認參數
#define WIDTH 1920
#define HEIGHT 1080
void calculate(int width = WIDTH, int height = HEIGHT) {
//do stuff
}
我可以將默認參數設置爲#defined值嗎?C++使用#define設置默認參數
#define WIDTH 1920
#define HEIGHT 1080
void calculate(int width = WIDTH, int height = HEIGHT) {
//do stuff
}
您可以使用#define
。但是,你應該嗎?
#define
忽略範圍,並有other problems。這個代碼也可以工作,不會讓任何人驚恐於不必要的定義。
enum {WIDTH = 1920 };
enum {HEIGHT = 1080 };
void calculate(int width = WIDTH, int height = HEIGHT)
{
//do stuff
}
這也將工作:
const int WIDTH = 1920;
const int HEIGHT = 1080;
void calculate(int width = WIDTH, int height = HEIGHT)
{
//do stuff
}
至於會這一點,雖然它不是清楚:
void calculate(int width = 1920, int height = 1080)
{
//do stuff
}
是。 WIDTH和HEIGHT宏將擴展到1920
和1080
。這將做一樣:
void calculate(int width = 1920, int height = 1080) { // ...
根據你的情況,你可能更喜歡在static const int
宏出於不同的原因,你可以找到on this answer;或者至少將WIDTH
和HEIGHT
重命名爲更具體的內容,因爲這看起來很容易出現衝突。正如另一個答案所述,使用靜態變量的一個好處是它們是有作用域的。
C++ 17注意:您將可以使用to inline a variable。如果在優化階段編譯器不能/不能在const上執行此操作,那麼您將來可能更喜歡這種方法。
是的,你可以,但不要這樣做,如果你可以避免它。想象一下,你有定義了一個頭
// foo.h
#define WIDTH 123
,由於某種原因,你包括包含這樣的標題在其他一些報頭中的以下內容:
// bar.h
#include "foo.h"
int bar(int WIDTH) { return WIDTH*2; }
我的經驗,這可能導致非常討厭的錯誤,如果你不使用宏,這可以完全避免。
你可能會認爲,資本從這種錯誤可以節省你,但是,那麼你仍然可以有
// moo.h
#define WIDTH 321
#include "foo.h"
這甚至不會導致一個編譯器錯誤,但更難以追查錯誤。
是不是默認參數的目的? –
實際上有什麼問題? –