簡単に言えば、私の問題は次のとおりです。さまざまな種類のオブジェクトを含む動的メモリマネージャーを構築しています。さまざまな種類のオブジェクトをそれぞれタグでマークしています。メモリのデバッグを容易にするために、これらのタグを、読み取り可能な 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 年になります。