【问题标题】:C Struct Assigning to Struct ArrayC Struct 分配给 Struct 数组
【发布时间】:2013-06-19 09:14:23
【问题描述】:

我正在尝试将一个结构添加到一个结构数组中,但是我收到了一个错误: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-&gt;pairs[var_name-&gt;size++] = { key, value; }pair p; p.key = key; p.value = value; var_name-&gt;pairs[var_name-&gt;size++] = p;,但还是不行。这是什么问题,看来应该可以了。

另外,是否有一个占位符可以写任何东西,我在维基百科上读到%pvoid*,所以我认为它可以工作。

我在 Mac 上使用 Xcode。

【问题讨论】:

  • 可怕,可怕,使用宏。
  • pair p; p.key = key; p.value = value; var_name-&gt;pairs[var_name-&gt;size++] = p;, but still not working. What is the problem here 宏参数的名称重复(带有结构成员)。

标签: c pointers macros struct placeholder


【解决方案1】:

试试这个

#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

【讨论】:

  • 这行得通,但为什么我必须从 key 更改为 _key 并从 value 更改为 _value
  • @aizen92 成员名称和宏参数重复。例如。 pair p; p.key = key; 宏展开 -->> pair p; p."key" = "key";
【解决方案2】:

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

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

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

例如见gcc's documentation on compound literals

【讨论】:

    【解决方案3】:

    除非这仅仅是一个格式问题,否则在我看来,您在 { .key = key, .value = value; } 的大括号的错误一侧使用了分号。

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

    【讨论】:

    • 是的,分号放错了位置,但即使没有它,或者在{之后我仍然得到同样的错误
    猜你喜欢
    • 2014-02-13
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    相关资源
    最近更新 更多