我正在尝试将结构添加到结构数组中,但是我收到错误: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;
,但仍然无法正常工作。这里有什么问题,好像应该有用。
此外,是否有一个占位符会写入任何内容,我在维基百科上读到%p
是void*
所以我可以使用它。
我在Mac上使用Xcode。
答案 0 :(得分:0)
除非它仅仅是一个格式化问题,否则我认为你在{ .key = key, .value = value; }
的花括号的错误一侧有分号。
应该是{ .key = key, .value = value };
。
答案 1 :(得分:0)
您不能拥有匿名的struct初始化表达式,编译器应该如何知道它具有什么类型?
假设您使用的是C99,语法为:
((pair) {.key = key, .value = value});
答案 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