为什么不能创建不透明的数据类型?

时间:2019-08-10 22:55:01

标签: c struct opaque-pointers

我正在尝试使用不透明的数据类型来理解它们。主要问题是我不断收到“不完整”错误。

main.c

#include <stdio.h>
#include <stdlib.h>
#include "blepz.h"

int main()
{
    setfnarp(GOO,5);
    int loogaboo = getfnarp(GOO);

    printf("%i", loogaboo);
    return 0;
}

fnarpishnoop.c

#include "blepz.h"

struct noobza {
    int fnarp;
};

void setfnarp(struct noobza x, int i){
    x.fnarp = i;
};

int getfnarp(struct noobza x){
    return x.fnarp;
};

blepz.h

struct noobza;

void setfnarp(struct noobza x, int i);

int getfnarp(struct noobza x);

struct noobza GOO;

我在这里显然不了解什么,我希望有人能帮我弄清楚如果不透明的数据类型的全部目的是您很难为它们找到实际的代码,那么该如何实现。

1 个答案:

答案 0 :(得分:3)

正如您已经提到的那样,使用尚未声明\"的内容的错误将导致“类型不完整”错误。

相反,使用指向struct的指针和返回指向struct的指针的函数,如下所示:

struct

...

struct noobza;

struct noobza *create_noobza(void);

void setfnarp(struct noobza *x, int i);

int getfnarp(struct noobza *x);

struct noobza *GOO;

...

#include <stdlib.h>
#include "blepz.h"

struct noobza {
    int fnarp;
};

struct noobza *create_noobza(void)
{
    return calloc(1, sizeof(struct noobza));
}

void setfnarp(struct noobza *x, int i){
    x->fnarp = i;
};

int getfnarp(struct noobza *x){
    return x->fnarp;
};