0

g++ でコンパイルすると、コードにいくつかのデータ構造があります。

typedef struct {
  int member;
  // [...]
} Record;

class Data {
  Record * records;
  // [...]
  static int method(const void * ptr);
};

そして、最初のバージョンが機能します:

int Data::method(const void * ptr) {
    Record * rec_1 = (Record *) ptr;
    return rec_1->member;
}

2 番目のバージョンは次のことを行いません。

int Data::method(const void * ptr) {
    __typeof__(records) * rec_1 = (__typeof__(records) *) ptr;
    return rec_1->member;
}

そしてエラーをスローします:

error: request for member ‘member’ in ‘* rec_1’, which is of non-class type ‘Record*’

私は__typeof__マクロを使います。なぜなら、それがどのようなタイプであるかを気にしなくて済むからrecordsです。マクロを保持し__typeof__、構造体のメンバーにアクセスできるようにすることは可能ですか?

4

2 に答える 2

3

recordsメンバーは、レコードではなく、レコードへのポインターです。したがって、必要rec_1なレコードへのポインターではなく、レコードへのポインターへのポインターであることを宣言しています。

さらに、コードをコンパイルしようとしている人のために:

  • 「typedef」のつづりを「typdef」と間違えました。
  • Record->member意図したところに書きましたrec_1->member
  • static メンバー関数methodは member を参照できませんrecords。削除staticすると、コンパイルできます。
于 2012-10-02T13:42:57.810 に答える
2

recordsタイプがありRecord*ます。typerec_1も同様Record**です。

rec_1->member実際のコードで行が, notであると仮定するとRecord->member、 object のメンバーにアクセスしようとしています*rec_1。しかし*rec_1typeRecord*があり、メンバーがありません。

実際のコードを投稿すると、誰かが実際の内容を推測せずに質問に答える可能性があります。報告するコンパイラ エラーを生成する、できるだけ短いプログラムを作成します。コードを 4 つのスペースでインデントします。それをコピーして質問に貼り付けます。

于 2012-10-02T13:42:21.787 に答える