12

私はそのような構造を持っています(何らかの理由で配列を使用することはできません):

  struct OperatorData 
  {
    char m_record_0[RIX_OPERATOR_CONFIG_SIZE];
    char m_record_1[RIX_OPERATOR_CONFIG_SIZE];
    //....
    char m_record_9[RIX_OPERATOR_CONFIG_SIZE];
  };

そして、コンパイル時にフィールドの量を計算しようとしています:

enum {fieldsAmount = sizeof(OperatorData) / sizeof(OperatorData::m_record_0)};

そして、コンパイラは次のようなメッセージを報告します。

Error:  #245: a nonstatic member reference must be relative to a specific object
  enum{fieldsAmount = sizeof(OperatorData) / sizeof(OperatorData::m_record_0)};
                                                                  ^

私はkeil uVision3 V3.60を使用しています。構造体の内側または外側のどこに enum 宣言を配置してもかまいません。コンパイラがこのメンバーのサイズを取得できないのはなぜですか?

4

7 に答える 7

12

お使いのコンパイラは、未評価のType::member式での使用を許可する C++11 をサポートしていないようです。次のような正しいタイプの式を作成する必要があります。

OperatorData* noImpl();

enum{fieldsAmount = sizeof(OperatorData) / sizeof(noImpl()->m_record_0)};
于 2012-04-18T10:01:16.163 に答える
5

typedef を使用します。

typedef char RecordType[RIX_OPERATOR_CONFIG_SIZE];

struct OperatorData 
{
   RecordType m_record_0;
   RecordType m_record_1;
   //....
   RecordType m_record_9;
};

それで:

enum {fieldsAmount = sizeof(OperatorData) / sizeof(RecordType)};
于 2012-04-18T10:01:42.717 に答える
4

これは安全ではないと思います。メンバーの間またはメンバーの後にパディングを追加できます。これはsizeof (OperatorData)、特定のメンバーのサイズには含まれませんが、含まれます。

もちろん、すでに利用可能な値を使用しRIX_OPERATOR_CONFIG_SIZEて近似値を取得できます。

const size_t num_records = sizeof (OperatorData) / RIX_OPERATOR_CONFIG_SIZE;

char配列にのみ使用され、パディングを小さくすると仮定します。

を使用することもできますoffsetof()。これには、少なくともメンバー間にパディングが含まれるという利点があります。

const size_t num_records = sizeof (OperatorData) /
       (offsetof(OperatorData, m_record_1) - offsetof(OperatorData, m_record_0));

繰り返しますが、これも単なる概算であることに注意してください。うまくいけば、パディングはメンバー自体よりもはるかに小さくなり、メンバーの貢献が四捨五入されます。

于 2012-04-18T10:00:21.990 に答える
3

::演算子を使用して非静的メンバーにアクセスすることはできません。

C++11 では、これを行うことができます (クイック デモ)。

#include <utility>

size = sizeof(OperatorData)/sizeof(std::declval<OperatorData>().m_record_0);

C++03 では、次のようにします。

size = sizeof(OperatorData) / sizeof(((OperatorData*)(0))->m_record_0);

式の型は((OperatorData*)(0))であるため、これとほぼ同等のサイズを取得するOperatorData*ために使用します。((OperatorData*)(0))->m_record_0

OperatorData*  od = ((OperatorData*)(0));
size_t size = sizeof(od->m_record_0); 

ただし、上記のステートメントは実行されますが、式は実行されないため、まったく同じではありsizeof()ません。

于 2012-04-18T10:01:01.427 に答える
2

最初に、コンパイラ プラグマ ( http://msdn.microsoft.com/en-us/library/2e70t5y1(v=vs.80).aspx、Visual Studio、http://gcc.gnu. gcc の org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html ) それ以外のsizeof(OperatorData)場合は何でもかまいません。

次に、レコードを取得して sizeof() で使用する OperatorData のインスタンスが必要です。

于 2012-04-18T10:07:11.020 に答える
0

これは、m_record_0が struct の静的メンバーではないためですOperatorData。それが静的メンバーである場合にのみ、それを行うことができます。

于 2012-04-18T09:59:00.610 に答える
0

構造体のオブジェクトを作成し、そのsizeof()上で演算子を使用します。

于 2012-04-18T09:59:16.463 に答える