2016-09-20 210 views
-1

我可以將默認參數設置爲#defined值嗎?C++使用#define設置默認參數

#define WIDTH 1920 
#define HEIGHT 1080 

void calculate(int width = WIDTH, int height = HEIGHT) { 
    //do stuff 
} 
+1

是不是默認參數的目的? –

+0

實際上有什麼問題? –

回答

1

可以使用#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 
} 
+0

如果它不是宏,爲什麼要保持它的大寫? – Slava

+0

因爲常規將常量放在大寫字母中 - 可以很容易地看到常量。 http://stackoverflow.com/questions/838929/naming-why-should-named-constants-be-all-uppercase-in-c-java在這方面有一些爭議。 –

+1

這不是傳統的習慣,它是從定義常量作爲預處理器宏發展而來的一種壞習慣。正是出於同樣的原因。 – Slava

0

是。 WIDTH和HEIGHT宏將擴展到19201080。這將做一樣:

void calculate(int width = 1920, int height = 1080) { // ... 

根據你的情況,你可能更喜歡在static const int宏出於不同的原因,你可以找到on this answer;或者至少將WIDTHHEIGHT重命名爲更具體的內容,因爲這看起來很容易出現衝突。正如另一個答案所述,使用靜態變量的一個好處是它們是有作用域的。

C++ 17注意:您將可以使用to inline a variable。如果在優化階段編譯器不能/不能在const上執行此操作,那麼您將來可能更喜歡這種方法。

0

是的,你可以,但不要這樣做,如果你可以避免它。想象一下,你有定義了一個頭

// 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" 

這甚至不會導致一個編譯器錯誤,但更難以追查錯誤。