C Struct分配给Struct数组

时间:2013-06-19 09:14:23

标签: c pointers macros struct placeholder

我正在尝试将结构添加到结构数组中,但是我收到错误:Parse Issue: Expected expression。以下是我的代码:

main.c

#include <stdio.h>

#include "map.h"

int main(int argc, const char * argv[]) {
    map(map_ss, char*, char*);

    map_init(map_ss, map);

    printf("Map has been initilized\n\n");

    // The error is over the next 3 lines
    add_pair(map, "first", "1");
    add_pair(map, "second", "2");
    add_pair(map, "third", "3");

    print_map(map);

    map_free(map);

    printf("\n\nMap has been freed.");

    return 0;
}

map.h

#ifndef Data_Structures_map_h
#define Data_Structures_map_h

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

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

#define map(name, key_t, value_t)                                           \
    pair(key_t, value_t);                                                   \
    typedef struct name {                                                   \
        pair* pairs;                                                        \
        int capacity;                                                       \
        int size;                                                           \
    } name

#define map_init(name, var_name)                                            \
    name* var_name = malloc(sizeof(var_name));                              \
    var_name->pairs = malloc(10 * sizeof(var_name->pairs));                 \
    var_name->capacity = 10;                                                \
    var_name->size = 0

#define map_free(var_name)                                                  \
    free(var_name)

#define add_pair(var_name, key, value)                                      \
    if (var_name->size == var_name->capacity)                               \
        var_name->pairs = realloc(var_name->pairs, 2 * var_name->capacity); \
    var_name->pairs[var_name->size++] = { .key = key, .value = value; }     \ // error in here

#define print_map(var_name)                                                 \
    printf("Contents of the map:\n");                                       \
    int i;                                                                  \
    for (i = 0; i < var_name->size; i++) {                                  \
        printf("Item #%i: Key:%p -> Value:%p\n",                            \
            (i+1), var_name->pairs[i].key, var_name->pairs[i].value);       \
    }                                                                       \

#endif /* Data_Structures_map_h */

我试过var_name->pairs[var_name->size++] = { key, value; }pair p; p.key = key; p.value = value; var_name->pairs[var_name->size++] = p;,但仍然无法正常工作。这里有什么问题,好像应该有用。

此外,是否有一个占位符会写入任何内容,我在维基百科上读到%pvoid*所以我可以使用它。

我在Mac上使用Xcode。

3 个答案:

答案 0 :(得分:0)

除非它仅仅是一个格式化问题,否则我认为你在{ .key = key, .value = value; }的花括号的错误一侧有分号。

应该是{ .key = key, .value = value };

答案 1 :(得分:0)

您不能拥有匿名的struct初始化表达式,编译器应该如何知道它具有什么类型?

假设您使用的是C99,语法为:

((pair) {.key = key, .value = value});

例如参见gcc's documentation on compound literals

答案 2 :(得分:0)

试试这个

#define add_pair(var_name, _key, _value)                                    \
    if (var_name->size == var_name->capacity)                               \
        var_name->pairs = realloc(var_name->pairs, 2 * var_name->capacity); \
    var_name->pairs[var_name->size].key = _key;                             \
    var_name->pairs[var_name->size++].value = _value