gpt4 book ai didi

c - 如何处理接口(interface)和实现中不完整的类型定义和前向声明

转载 作者:行者123 更新时间:2023-11-30 15:29:36 25 4
gpt4 key购买 nike

好吧,让我先回答这个问题。这个问题已经被问到,但没有专门针对不更改 .h 文件的情况得到回答,因此请不要链接到已通过“哦,将其移动到 .h 文件”来回答的问题。我目前正在上课,老师递给我们 .h 文件并说,对此进行实现并且不要更改 .h 文件中的任何内容。我按照建议将结构等移动到我之前项目中的 .h 文件,因此我的成绩受到了很大的打击

话虽这么说,让我发布一些代码并了解细节。

.h 文件

#ifndef _list_h
#define _list_h

typedef char *ListItemP //a pointer to an item in the list
typedef struct List *ListP //a pointer to the List struct itself

somefunctions();

#endif

.c 文件

#include "List.h"
struct List
{
int foo;
ListItemP bar;
};

ListP newList()
{
// implementation, I understand and am confident I used malloc
// and everything else correctly to make a new struct
}

main.c 或 tester.c 或任何你想称之为的文件,我在其中测试实现和接口(interface)(分别为 .c 和 .h)

#include <stdio.h>
#include <stlib.h>
#include "List.h"

int main()
{
ListP n1 = newList();
n1->foo = 5;

return 0;
}

这些是我在 unix (osx) 终端上使用 gcc -O List.c main.c 进行编译后遇到的错误

 main.c:16:5: error: incomplete definition of type 'struct List'

n1->foo = 5;
~~^

./List.h:21:16: note: forward declaration of 'struct List'

typedef struct List *ListP;
^
1 error generated.

任何帮助将不胜感激,如果您坚持将我链接到之前提出的问题,请指出他们在该问题中回答了我的问题的具体部分。也许我错过了,但我觉得我已经非常彻底地检查了这些问题。从本类(class)开始以来,这个问题一直困扰着我,所以一段代码可以让我明白,但我希望有一个解释,这样我终于可以明白我做错了什么。谢谢谢谢谢谢。

最佳答案

由于 List 的定义仅由“.c”文件识别,因此访问其成员的所有代码都必须在那里。这是一种有效的技术,可以强制所有其他源文件仅处理指针而不处理其成员。因此,您的测试器代码应该调用“.c”文件中实现的函数来填充它。

void
setFoo(ListP p, int foo);

int main()
{
ListP n1 = newList();
setFoo(n1, 5);

return 0;
}

在定义“List”的“.c”文件中:

void
setFoo(ListP p, int foo)
{
p->foo = foo;
}

无论如何,“setFoo”的原型(prototype)需要对您的测试程序可见。您可能想在头文件中定义它,或者只是将其添加到测试器主体本身。

关于c - 如何处理接口(interface)和实现中不完整的类型定义和前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26164817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com