-2

皆さん、

問題文 - C++ では、(静的) const をクラス スコープに限定することが許可されているため、名前空間全体を汚染する #defines を取り除くことができますか?

私の意見は NO です (次の異なる例では) 。なぜ、何が最良の代替案なのかを知りたいと思います。VS がエラー C2589 を生成する: 'const' : '::' の右側に不正なトークン

例1

//ああ

クラスA {

…
.. 
static const uint_32 myConst = 1234;

};

//b.cpp

「ああ」を含める</h1>

… B() { uint32_t arr[A::myConst]; // C2589! const : '::' の右側の不正なトークン }

例 2

//ああ

クラス A { … .. enum blah { ... myConst = 1234, .. }; };

//b.cpp

「ああ」を含める</h1>

... B() { uint32_t arr[A::myConst]; // C2589! const : '::' の右側の不正なトークン }

4

3 に答える 3

12

マクロを使用する場合:

#define CONST 1234

使用する場所に置き換えます。

static const int CONST = 1234;

最終結果はナンセンスです。

static const int 1234 = 1234;

別の例では:

   Int a1[a::CONST];  

これもナンセンスになります。

   Int a1[a::1234];  

これはすべて疑問を投げかけます、あなたは何をしようとしていますか?


CONSTここでは、マクロと同じ名前のメンバー変数を作成しようとしているようです。

class A
{
  static const int CONST = 1234;
};

ただし、このコードがコンパイルされると、マクロは既に定義されているため、プリプロセッサは、コンパイラ自体がクラックを取得する前に、マクロを置き換えることによってこれを変更します。コードをコンパイルすると、次のようになります。

class A
{
  static const int 1234 = 1234;
};

最善の方法は、マクロを完全に廃止してから、コードを改造して、ここで行おうとしているような適切な定数を使用することです。混同しないでください。少なくとも、マクロと同じ名前をメンバーに使用しないでください。

于 2013-11-08T18:48:36.800 に答える
7

まず第一に、あなたのクラスはA大文字Aではなくと呼ばれますa。クラス名は、使用しようとしている定数を修飾するために使用されます。したがって、コードを使用するように変更してくださいA::CONST。ところで、これは C# や Java ではなく C++ であるためInt、何らかの奇妙な理由で独自の整数型を発明することを決定しない限り、 のようなものはありません。

余談ですが、すべて大文字を使用して定数に名前を付けると、マクロと衝突する可能性があり、特に前処理が最初に行われ、定数のすべてのケースがマクロに置き換えられるため、問題が発生する可能性があります。これにより、理解が困難な構文エラーを含む無効な C++ コードが生成されることがよくあります。これが、マクロで最も一般的に使用される規則であるため、定数の名前にすべて大文字を使用しないでください。

于 2013-11-08T18:49:14.597 に答える