2

任意のキー値タイプを受け入れることができるノードを作成しようとしています。今のところ一度使うと動くのですが、もう一度使うとエラーが出ます。

以下は私が書いたコードです:

map.h:

#ifndef Data_Structures_map_h
#define Data_Structures_map_h

#include <stdio.h>
#include <stdlib.h>

#define node(key_t, value_t)    \
    typedef struct node {       \
        key_t key;              \
        value_t value;          \
    } node

#endif /* Data_Structures_map_h */

main.c:

#include <stdio.h>

#include "map.h"

int main(int argc, const char * argv[]) {
    node(char*, int);
    node* n = malloc(sizeof(node*));
    n->key = "first";
    n->value = 1;

    printf("the node n has a key of %s and a value of %d.\n", n->key, n->value);

    // error starts from here
    node(char, char*);
    node* n2 = malloc(sizeof(node*));
    n2->key = 'a';
    n2->value = "first";

    printf("the node n2 has a key of %c and value of %s.\n", n2->key, n2->value);

    return 0;
}

機能させるにはどうすればよいですか?

編集:

エラーはRedefinition of 'node'あり、残りは警告です。私はXcodeを使用しています。

4

2 に答える 2

1
#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    void *key;
    void *value;
} node;

static void *_vp;
#define box(type, value) (_vp = malloc(sizeof(type)), *(type*)_vp=value, _vp)
#define unbox(type, obj) (*(type*)obj)

int main(void) {
    node* n = malloc(sizeof(node));
    n->key = "first";//Reference type as it is
    n->value = box(int, 1);//Value type boxing

    //Reference type cast, Value type unboxing
    printf("the node n has a key of %s and a value of %d.\n", (char*)n->key, unbox(int, n->value));

    node* n2 = malloc(sizeof(node));
    n2->key   = box(char, 'a');
    n2->value = "first";

    printf("the node n2 has a key of %c and value of %s.\n", unbox(char, n2->key), (char*)n2->value);

    return 0;
}
于 2013-06-18T17:42:27.853 に答える