1

簡単に言えば、私の問題は次のとおりです。さまざまな種類のオブジェクトを含む動的メモリマネージャーを構築しています。さまざまな種類のオブジェクトをそれぞれタグでマークしています。メモリのデバッグを容易にするために、これらのタグを、読み取り可能な 4 バイトの文字列としてメモリに表示したいと考えています。ただし、これらの値を効率的に切り替えるには、これらの値を符号なし 32 ビット整数と見なしたいと考えています。

現在、オブジェクトの定義は次のようになっています。

/**
 * an object in cons space.
 */
struct cons_space_object {
  char tag[TAGLENGTH];         /* the tag (type) of this cell */
  uint32_t count;              /* the count of the number of references to this cell */
  struct cons_pointer access;  /* cons pointer to the access control list of this cell */
  union {
    /* if tag == CONSTAG */
    struct cons_payload cons;
    /* if tag == FREETAG */
    struct free_payload free;
    /* if tag == INTEGERTAG */
    struct integer_payload integer;
    /* if tag == NILTAG; we'll treat the special cell NIL as just a cons */
    struct cons_payload nil;
    /* if tag == REALTAG */
    struct real_payload real;
    /* if tag == STRINGTAG */
    struct string_payload string;
    /* if tag == TRUETAG; we'll treat the special cell T as just a cons */
    struct cons_payload t;
  } payload;
};

タグは、次の 4 つの文字列定数です。

#define CONSTAG  "CONS"

私ができるようにしたいのは、次のようなものです

switch ( cell.tag) {
  case CONSTAG : dosomethingwithacons( cell);
  break;

もちろん、弦をオンにすることはできません。ただし、これらは 4 バイト文字列であるため、32 ビットの unsigned int としてメモリ内で読み取ることができます。私が欲しいのは、引数として文字列を指定すると、unsigned int を返すマクロです。私はもう試した

/**
 * a macro to convert a tag into a number
 */
#define tag2uint(tag) ((uint32_t)*tag)

しかし実際には、そのアドレスの最初の文字の ASCII 値を数値として返します。つまり、

tag2uint("FREE") => 70

これは 'F' のアスキー コードです。

誰かが私のためにこれを解決しますか? C で本格的なものを書いてから 20 年になります。

4

1 に答える 1

3
#define tag2uint(tag) ((uint32_t)*tag)

は、「逆参照tag'F'例を取得)してから、に変換するuint32_t」ことを意味します。

あなたがしたいことは

#define tag2uint(tag) (*(uint32_t*)tag)

これは、「tagへのポインターとして扱いuint32_t、それを逆参照する」ことを意味します。

于 2017-01-06T16:14:35.507 に答える