0

我正在尝试将结构添加到结构数组中,但是出现错误: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;,但还是不行。这里有什么问题,它似乎应该工作。

此外,是否有一个占位符可以向其写入任何内容,我在 Wikipedia 上读到它%p是为了void*让我认为它可以工作。

我在 Mac 上使用 Xcode。

4

3 回答 3

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
于 2013-06-19T09:37:07.533 回答
0

你不能有匿名的结构初始化表达式,编译器怎么知道它有什么类型?

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

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

例如,参见gcc 关于复合文字的文档

于 2013-06-19T09:33:04.930 回答
0

除非它仅仅是一个格式问题,否则在我看来,你在{ .key = key, .value = value; }.

应该 { .key = key, .value = value };改为。

于 2013-06-19T09:32:30.370 回答