13

私はこのようなことをしています

Class.hpp:

 class Class {

 private:
     static const unsigned int arraySize;
     int ar[arraySize+2];
 };

Class.cpp:

#include <Class.hpp>
const unsigned int arraySize = 384;

コンパイラ (q++、g++ ベースの QNX OS 用の c++ コンパイラ) は、 (Class.cpp のコンパイル中ではなく)error: array bound is not an integer constantユニットのコンパイル中に提供します。Class.hpp

なぜそれが機能しないのですか?静的な const メンバーは、C++ 標準で保証されている配列バインドとして使用できることを知っています (この anwserを参照)。しかし、なぜコンパイラは の結果をstatic const + const定数として認識しないのでしょうか?

4

2 に答える 2

13

これは、コンパイラによって受け入れられるべき優れたコードです。

class Class { 
  const static int arraySize = 384; 
  int ar[arraySize+2]; 
}; 

そうでない場合は、コンパイラが壊れています。

ただし、実際の定数をヘッダーファイルから選択した変換単位に移動すると、コードが無効になります。

// Class.h
class Class { 
  const static int arraySize;
  int ar[arraySize+2]; // ERROR
}; 

// Class.cpp
const int Class::arraySize = 384;

これは、Classコンパイル時に、ヘッダーで使用可能なデータだけからオブジェクトのサイズを決定できないためです。これは正確には正しい理由ではありませんが、これらの線に沿った推論は、このようなコンパイルエラーを理解するのに役立ちます。

このような間違いを避けるために、次のように置き換えることができますstatic const intenum

class Class { 
  enum { arraySize = 384 }; 
  int ar[arraySize+2]; 
}; 
于 2012-01-20T08:35:29.953 に答える
2

コメントが言うように、これが実際にgccでコンパイルされることに驚いています。384はヘッダーファイルにないため、のサイズは他Classのコンパイルユニットには認識されません。使用方法や使用方法によっては、一部のコンパイルユニットでは問題にならない場合がありますがClass、このコンパイルは想像できません。

// this is a source file called, say, blah.cpp
#include <Class.hpp>

void someFunc()
{
    void *mem = malloc(sizeof(Class));  // size is not known, so this can't compile

    // do something with mem
}

.hppに含める必要があります:

class Class {

 private:
     static const unsigned int arraySize = 384;
     int ar[arraySize+2];
 };

..ここにリンクするのはOPにあるので。

于 2012-01-20T08:45:27.790 に答える