2016-11-11 105 views
4

我已經寫了,看起來像這樣的switch語句:是case statement1 + statement2:糟糕的編碼?

switch(statement){ 
    case statement1: 
     break; 
    case statement2: 
     break; 
    case statement3: 
     break; 
    case statement4: 
     break; 
    case statement1 + statement2: 
     break; 
    case statement1 + statement3: 
     break; 
    case statement1 + statement4: 
     break; 
    default: 
     break; 
} 

與標題中定義的這樣的語句:
#define statement1 999
#define statement2 32898
#define statement3 32899
#define statement4 32900
這編譯並工作正常使用visual studio 2003.

對我而言,這是提供更多的陳述而不需要定義更多的變量。根據之前的代碼中選擇的語句,允許我有不同的選項。

社區如何看待此代碼?公認?不好的做法?避免的?

我能看到的唯一風險是如果有定義33897,33898,33899。

+0

規則是,案例標籤基本上需要編譯時數字常量。你問到的更多是個人風格問題,這是一個非常主觀的問題,在這裏不太適合。 –

+0

if-else語句對我來說似乎更好。 –

+2

@Someprogrammerdude哦,不,這是非常客觀可怕的。(a)因爲常量不是2個標誌的權力,所以它們的加法不會產生唯一的值,並且(b)使它們變成宏而不是不變,這會導致名稱污染。 –

回答

3

嗯,雖然我不喜歡開關,但我認爲你的代碼可以提高很多。

首先,在開關中使用運算符沒有錯。你可以使用任何你想要的constexpr事物。對整數的操作是constexpr。

我會改變的事情是這樣的:

const int statement1 = 999; 
const int statement2 = 32898; 
const int statement3 = 32899; 
const int statement4 = 32900; 

我會用constexpr如果C++ 11是可用的。

宏可以隱藏黑幕,比如函數調用和複雜操作。現在它們是整數,可以在編譯時使用。

除此之外,常數很難讀懂,特別是那些名字。你可以在編譯時使用constexpr函數產生這些常量的值,或者簡單地給它們一個更好的名字並且可能對它進行註釋。

在switch語句中添加整數在實踐中並不差,但正如您所說,我能看到的唯一風險是是否存在定義33897,33898,33899。這就是爲什麼您應該給結果賦予意義這些操作。如果33897是真的,你要測試的值,那麼做到這一點:

const int combine2 = statement1 + statement2; 
const int combine3 = statement1 + statement3; 

您可以定義那些在您非常的功能,如果你不希望他們在全局範圍內。

+0

像其他答案一樣,這個數字常量的選擇不好。 –

+0

我拿OP給我們的常量。我可以添加一些答案,可以說明這一點。 –

+0

我的觀點是,這些常量是不好的,它們實際上是一個比使用宏更糟糕的問題,所以它們需要在一個完整的答案中處理。問題不在於常量很難閱讀。他們**導致錯誤**,因爲他們不是兩個冪,所以不同的常量組合會導致相同的值。 –

3

儘可能避免#define。是的,這是一個不好的做法。

您可以用constexpr做到這一點:

constexpr int statement1 = 2; 

,你可以做同樣的事情。但你會得到更多的表現力和類型安全。

+0

但看到我的問題下的警告。使用'constexpr'只是必要變更的一部分。 –

+3

VC++ 2003不支持C++ 11。 – edmz

+0

@KonradRudolph:它確實,但不完全。 在一個開關中,你只能使用編譯時常量,而你這樣做。但作爲主觀意見,我會創建合併(element1 + element2)作爲定義或constexpr以外的其他名稱的開關,並在開關標籤沒有「+」 – LeDYoM