我有以下代码,我收到一条错误消息,指出参数map
的类型不完整。变量strings
是一个smap
,在以下代码所在的一个头文件中声明为extern。
如何解决此问题,或错误意味着什么,或导致此错误的常见原因是什么?
void print_strings(smap map);
void emit_strings(AST *ast) {
/* TODO: Implement me. */
printf(".data\n");
print_strings(strings);
}
void print_strings(smap map){
for (size_t i = 0; i < map -> num_buckets; i += 1) {
for (size_t j = 0; j < map -> buckets[i].num_pairs; j+=1) {
printf("str%d: .asciiz %c\n",label_count,map ->buckets[i].pairs[j].key);
label_count ++;
}
}
label_count = 0;
}
答案 0 :(得分:3)
我之前发布了一个错误的答案,但是用户@mafso慷慨地引导我朝着正确的方向前进。
我之前忽略的问题是你的print_strings
函数试图直接访问smap
类型的成员变量。由于这是一个不完整的类型(即它在一个单独的源文件中定义),你不能这样做。您需要使用标头中声明的任何函数才能访问buckets
及其内部值。
典型的标题可能如下所示:
#ifndef SMAP_H
#define SMAP_H
#include "bucket.h"
#include <stdlib>
typedef struct string_map *smap;
smap smap_create(size_t num_buckets);
bucket *smap_get_buckets(smap map):
void *smap_add_bucket(smap map, bucket b);
#endif
在此示例中,您不会使用map->buckets
来访问buckets
成员,而是调用getter:smap_get_buckets(map)
。
事实是,这是所有猜测,因为您仍未提供有关声明和定义smap
的文件的任何提示。