C - error: incomplete definition of type 'struct name_s'
C - error: incomplete definition of type 'struct name_s'
我尝试在 C 中实现布隆过滤器。我将文件分成两个 header 一个 public 和一个私有文件。第一个包含函数的签名 e 结构的 typedef,第二个包含结构的定义。
这是下面标题的代码:
bloom_filter_private.h
#ifndef BLOOM_FILTER_PRIVATE_H
#define BLOOM_FILTER_PRIVATE_H
#include <pds/bloom_filter.h>
struct bloom_filter_s {
int *bit_vector;
int dimension;
};
#endif /* BLOOM_FILTER_PRIVATE_H */
bloom_filter.h
#ifndef BLOOM_FILTER_H
#define BLOOM_FILTER_H
typedef struct bloom_filter_s* bloom_filter_t;
bloom_filter_t bloom_filter_create(int const dimension);
int bloom_filter_destroy(bloom_filter_t bloom_filter);
#endif /* BLOOM_FILTER_H */
最后我有一个文件,我在其中实现了 create/destroy 函数的代码:
bloom_filter.c
#include <stdio.h>
#include <stdlib.h>
#include "bloom_filter_private.h"
bloom_filter_t bloom_filter_create(int const dimension) {
if ( dimension >= 0) {
int i;
bloom_filter_t bloom_filter = malloc(sizeof(struct bloom_filter_s));
if ( bloom_filter == NULL) {
perror("Unable to create a bloom filter");
abort();
}
bloom_filter->bit_vector = NULL;
if ( dimension > 0 ) {
bloom_filter->bit_vector = (int *) malloc(dimension * sizeof(int));
if ( bloom_filter->bit_vector == NULL ) {
perror("Unable to create a bit vector");
abort();
}
for ( i = 0; i < dimension; i++ )
bloom_filter->bit_vector[i] = 0;
}
bloom_filter->dimension = dimension;
return bloom_filter;
}
else return NULL;
}
int bloom_filter_destroy(bloom_filter_t bloom_filter) {
if ( bloom_filter != NULL) {
free(bloom_filter->bit_vector);
free(bloom_filter);
return 1;
}
return -1;
}
文件 bloom_filter.c
和 bloom_filter.h
在同一个名为 src
的文件夹中。文件 bloom_filter_private.h
位于文件夹 include
.
的子文件夹 pdf
中
问题是我尝试使用以下简单代码创建一个空的布隆过滤器,但我遇到了这个错误:
error: incomplete definition of type 'struct bloom_filter_s'
因此我无法访问该结构的文件。
main.c
#include <stdio.h>
#include <pds/bloom_filter.h>
int main(void) {
int i;
bloom_filter_t bloom_filter = bloom_filter_create(10);
for ( i = 0; i < 10; i++ )
printf("[%d] =: %d\n", i, bloom_filter->bit_vector[i]);
return 0;
}
将结构定义放入私有文件的全部意义在于用户无法看到内容。如果你想让用户访问这些字段,你需要在你的库中创建访问函数:
bloom_filter.c:
int get_vector_element(bloom_filter_t bloom_filter, int index)
{
return bloom_filter->bit_vector[index];
}
bloom_filter.h:
int get_vector_element(bloom_filter_t bloom_filter, int index);
您可以在 main
中执行以下操作:
for ( i = 0; i < 10; i++ )
printf("[%d] =: %d\n", i, get_vector_element(bloom_filter, i));
我尝试在 C 中实现布隆过滤器。我将文件分成两个 header 一个 public 和一个私有文件。第一个包含函数的签名 e 结构的 typedef,第二个包含结构的定义。
这是下面标题的代码:
bloom_filter_private.h
#ifndef BLOOM_FILTER_PRIVATE_H
#define BLOOM_FILTER_PRIVATE_H
#include <pds/bloom_filter.h>
struct bloom_filter_s {
int *bit_vector;
int dimension;
};
#endif /* BLOOM_FILTER_PRIVATE_H */
bloom_filter.h
#ifndef BLOOM_FILTER_H
#define BLOOM_FILTER_H
typedef struct bloom_filter_s* bloom_filter_t;
bloom_filter_t bloom_filter_create(int const dimension);
int bloom_filter_destroy(bloom_filter_t bloom_filter);
#endif /* BLOOM_FILTER_H */
最后我有一个文件,我在其中实现了 create/destroy 函数的代码:
bloom_filter.c
#include <stdio.h>
#include <stdlib.h>
#include "bloom_filter_private.h"
bloom_filter_t bloom_filter_create(int const dimension) {
if ( dimension >= 0) {
int i;
bloom_filter_t bloom_filter = malloc(sizeof(struct bloom_filter_s));
if ( bloom_filter == NULL) {
perror("Unable to create a bloom filter");
abort();
}
bloom_filter->bit_vector = NULL;
if ( dimension > 0 ) {
bloom_filter->bit_vector = (int *) malloc(dimension * sizeof(int));
if ( bloom_filter->bit_vector == NULL ) {
perror("Unable to create a bit vector");
abort();
}
for ( i = 0; i < dimension; i++ )
bloom_filter->bit_vector[i] = 0;
}
bloom_filter->dimension = dimension;
return bloom_filter;
}
else return NULL;
}
int bloom_filter_destroy(bloom_filter_t bloom_filter) {
if ( bloom_filter != NULL) {
free(bloom_filter->bit_vector);
free(bloom_filter);
return 1;
}
return -1;
}
文件 bloom_filter.c
和 bloom_filter.h
在同一个名为 src
的文件夹中。文件 bloom_filter_private.h
位于文件夹 include
.
pdf
中
问题是我尝试使用以下简单代码创建一个空的布隆过滤器,但我遇到了这个错误:
error: incomplete definition of type 'struct bloom_filter_s'
因此我无法访问该结构的文件。
main.c
#include <stdio.h>
#include <pds/bloom_filter.h>
int main(void) {
int i;
bloom_filter_t bloom_filter = bloom_filter_create(10);
for ( i = 0; i < 10; i++ )
printf("[%d] =: %d\n", i, bloom_filter->bit_vector[i]);
return 0;
}
将结构定义放入私有文件的全部意义在于用户无法看到内容。如果你想让用户访问这些字段,你需要在你的库中创建访问函数:
bloom_filter.c:
int get_vector_element(bloom_filter_t bloom_filter, int index)
{
return bloom_filter->bit_vector[index];
}
bloom_filter.h:
int get_vector_element(bloom_filter_t bloom_filter, int index);
您可以在 main
中执行以下操作:
for ( i = 0; i < 10; i++ )
printf("[%d] =: %d\n", i, get_vector_element(bloom_filter, i));