2016-08-16 5 views
0

を格納する列挙型を使用して私は最近、次のようであったコードに出くわした:数値定数

#include <stdio.h> 

class Example { 
private: 
    enum { 
     BufSize = 4096, 
     MsgSize = 200 * 1024, 
     HeaderFieldLen = 16 
    }; 
public: 
    int getBufSize() { 
     return BufSize; 
    } 
}; 

int main() { 
    Example ex; 
    printf("%d\n", ex.getBufSize()); 
    return 0; 
} 

クラスは、本質的に列挙型の定数を格納し、そのメンバ関数にそれらの値を用いました。

これはenumの有効な使用ですか、そうであれば、structまたは通常のconstのクラスメンバー変数ではなく、このように定数を格納する理由がありますか?

+1

これはC-ismですが、(やや不明瞭な)C++コードでも有効です。 – milleniumbug

+2

このように、列挙型の値は、メンバーとは異なり、実際には結果のバイナリに「格納」されません。しかし、それが実際に関連しているかどうかはわかりません。 –

+0

「実行時に名前で」?? –

答えて

2

magic numbersを避けるために数値定数の名前を付ける方法はいくつかあります。列挙子の使用はその1つです。

通常のconst変数よりこの方法の利点は、列挙子が変数ではないということです。したがって、実行時に変数として格納されることはなく、コンパイル時にコンパイラによって単に使用されます。 [コメントから]


だから、この使用法は、いくつかの方法で定数を定義するプリプロセッサマクロを使用するのと同様でしょうか?

マクロの欠点は(主に)型安全性です。マクロには型がないため、コンパイラは、型が使用する場所と型が一致するかどうかをチェックすることはできません。また、マクロはC言語で使用されていますが、C++ではほとんど使用されていません。

C++ 11では、これらの定数に名前を付けるより良い方法は、constexprのメンバーを使用することです。

constexpr int BufSize = 4096; 
constexpr int MsgSize = 200 * 1024; 
constexpr int HeaderFieldLen = 16; 

上記のコードは以下のコードに置き換わります。

enum { 
    BufSize = 4096, 
    MsgSize = 200 * 1024, 
    HeaderFieldLen = 16 
}; 
0

有効なのはです。

初期の段階では、すべてのコンパイラがstatic const data memberをサポートしていませんでした。したがって、このenumハックを使用して静的const整数データメンバーをシミュレートする必要があります。

コンパイラはstatic const data memberを非常にうまくサポートしているので、このハックを使用する必要はありません。

// in example.h 
class Example { 
    static const int BufSize = 4096; 
}; 

// in example.cpp 
const int Example::BufSize; // definition 
+0

初期化であなたのcppを汚染しなければならないので、Enumはまだstatic constデータメンバよりずっと優れています。 :(。intの場合。 –