2016-11-11 5 views
4

私はこのようになりますswitch文書かれている。このようなヘッダで定義された書類とcase文1 + 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
これは、コンパイルして使用して正常に動作しますビジュアルスタジオ2003.

私にとってこれはより多くの変数を定義する必要性からより多くのステートメントを提供します。前のコードでどのステートメントが選択されているかに応じて、私は異なるオプションを持つことができます。

コミュニティはこのコードをどのように認識しますか?受け入れられましたか?悪い練習ですか?避けられる?

私が見ることができる唯一のリスクは、定義33897,33898,33899が存在するかどうかです。

+0

基本的には、ラベルはコンパイル時の数値定数である必要があります。あなたが尋ねることは、もっと個人的なスタイルの問題です。それは非常に主観的な質問であり、実際にはここにはあまり適していません。 –

+0

if-elseステートメントは私にとって非常によかったようです。 –

+2

@Someprogrammerdudeああ、これは非常に客観的にひどいです。定数は2つのフラグの累乗ではないので、それらの加算は一意の値をもたらさないため、(b)定数ではなくマクロにすることは名前汚染につながります。 –

答えて

3

私はスイッチが好きではありませんが、コードを大幅に改善できると思います。

まず、スイッチの演算子を使用するのは間違いではありません。あなたは、あなたが望むあらゆる種類のconstexprを使うことができます。整数演算はconstexprです。

私は変化するであろう事はこれです:C++ 11が利用可能であった場合、私はconstexprを使用する

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

マクロは、関数呼び出しや複雑な操作のような陰影を隠すことができます。今はコンパイル時に使えるintです。

特に、これらの名前では、定数は読みにくいです。コンパイル時に、constexpr関数を使用してこれらの定数の値を生成することもできますし、単により良い名前を付けてコメントすることもできます。

switch文で整数を一緒に追加するのは実際には悪くないが、私が見ることができる唯一のリスクは定義33897,33898,33899があるかどうかということです。これが結果に意味を与えるべき理由ですそれらの操作の。 33897は本当にあなたがテストする値である場合は、次の操作を行います。あなたはグローバルスコープでそれらをしたくない場合は

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

あなたは非常に機能のものを定義することができます。

+0

もう一つの答えと同様に、これは数値定数の悪い選択に苦しんでいます。 –

+0

私はOPが私たちに与えた定数を取った。私はそれを伝える答えに何かを加えることができました。 –

+0

私の主張は、これらの定数が悪いことです。実際には、マクロを使用するよりも悪い問題であり、完全な答えで処理する必要があります。問題は、定数が読みにくいということではありません。彼らは** 2のべき乗ではないのでエラー**につながるので、定数の異なる組み合わせは同じ値になります。 –

3

できるだけ#defineを避けるようにしてください。はい、それは悪い習慣です。

あなたはconstexprのでそれを行うことができます:

constexpr int statement1 = 2; 

、あなたは正確に同じことを行うことができます。しかし、より表現力と型の安全性を得ることができます。

+0

しかし質問の下で私の警告を見てください。 'constexpr'を使うことは、必要な変更の一部にすぎません。 –

+3

VC++ 2003はC++ 11をサポートしていません。 – edmz

+0

@KonradRudolph:それはしますが、完全ではありません。 スイッチでは、コンパイル時定数のみを使用する必要があります。しかし、主観的な意見として、私は、他の名前でswitchの外側にあるdefineまたはconstexprとして合計(element1 + element2)を作成し、スイッチにラベルを追加します "+" – LeDYoM

関連する問題