1

私は次のtypedefを持っています

 typedef struct {   
         const char *name;
         void *variable;
         int type;
         int *present;
  } parse_t;

および _b が追加された同じ名前の変数と整数を持つ構造体。

例えば:

 typedef struct {
     char test[12]; 
     int test_b;

     long id; 
     int id_b;

  } record_t;

私がやろうとしているparse_tのは、変数の型に応じてそれを書き込む構造体でレコードを定義するマクロです。

例えば:

    record_t record;

    prase_t parse[] = 
    {
        ROW("TEST", record, test, TYPE_STRING);
        ROW("ID", record, id, TYPE_INT);
    }

ROW で次のことを行います。

  • 名前の値の設定
  • タイプに基づいて、それが の場合は変数としてTYPE_STRING使用し、それ以外の場合は使用しますrecord.<variable>&(record.id)
  • タイプ値を設定する
  • マクロに渡される変数名に _b を追加し、行で使用します。

私は多くのオプションを試しましたが、最も近いものは次のとおりでした

 #define ROW(x, y, z, v) {x, (TYPE_STRING == v) ? y.z:&(y.z), v, &(y.z##_b)}

しかし、次のように使用するとエラーが発生します

     The ":" operator is not allowed between "char[4]" and "char(*)[4]".

助けていただければ幸いです。たとえば、文字列型用と int 用の 2 つの異なるマクロをいつでも使用できると思いますが、できる限り単純化しようとしています。

4

1 に答える 1

1

なぜTYPE_STRINGテストが必要なのですか?配列を に変換するだけの場合、配列のアドレスを取得するのは面倒ですvoid *。その場合、配列はポインターに減衰するためです。だからただ使う

#define ROW(x,y,z,v)  { x, &(y.z), v, &(y.z##_b) }
于 2013-09-23T19:05:33.397 に答える