【问题标题】:Why can't I create an opaque data type?为什么我不能创建不透明的数据类型?
【发布时间】:2019-12-18 03:36:00
【问题描述】:

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

ma​​in.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;

我显然不明白这里的一些东西,我希望有人能帮助我弄清楚不透明数据类型是如何实现的,如果它们的全部意义在于你很难找到它们的实际代码。

【问题讨论】:

  • 你通常不应该做的一件事是在头文件中声明变量。在这种情况下,不要将struct noobza GOO 放在头文件中。由于您只在main.c 中使用它,因此在此处声明它。这也应该可以帮助你理解为什么你不能在main.c 中使用struct noobza GOO;,因为只有fnarpishnoop.c 知道结构的样子。但是,您可以使用指向不完整类型的指针,因为无论如何指针都有固定的大小,编译器不必知道所指向的实际结构的样子。所以基本上,删除blepz.h的最后一行并根据.y修复。
  • @Cheatah 当然,如果我使用struct noobza GOO; 超过main.c,我将不得不将它放在头文件中以赋予它一个全局范围,不是吗?

标签: c struct opaque-pointers


【解决方案1】:

正如您已经提到的,使用您尚未声明其内容的 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;
};

...

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

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

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

【讨论】:

  • 当你声明没有内容的结构时,这称为前向声明
猜你喜欢
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
  • 2016-06-20
相关资源
最近更新 更多