gpt4 book ai didi

C 抽象数据类型指针 - 程序模块化

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

如果某个模块依赖于其他子模块,或者将其包含在其头文件中或代码文件中,那么如果模块除了对主程序有贡献之外还相互依赖怎么办?

下图示意性地说明了 module1.h/.c 需要子模块 module4.h,而 module2 需要 module3 的情况。

Example

每个头文件都有自己的 typedef 结构示例:

typedef struct list * List;

和与头文件相关的源文件实现如下结构:

struct list {
unsigned length;
char * value;
};

我在头文件中得到了另一个结构:

typedef enum {START, END, MIDDLE, COMMENTS, CONDITIONS} TypeListBal;
typedef struct bal * Bal;

和源文件:

struct bal {
TypeListBal type;
List name; // Name of the bal
List attributes[]; // Array of type struct List
};

今晚我读了很多书,但有一件事我不太确定。如果我只是将头文件包含在我需要的源文件中,我会将 list.h 包含在 bal.c 中,因为我的 bal.c 得到了一个作为 List 类型成员的结构定义。

为了使其工作,我是否必须在所有模块中放置特定的#INCLUDE,还是在编译时完成工作?

我的意思是在 make makefile 中,要拥有我的 bal.o 对象,它看起来像:

bal.o: list.o bal.c bal.h
$(CC) -g -W -Wall -c list.o bal.c bal.h

因此,一旦 makefile 尝试编译 bal.o,编译器就会看到所有依赖项,并且能够编译所有内容。

这就是我的理解,但是当我尝试这个时,我得到:

error: dereferencing pointer to incomplete type

我猜这是因为在我的 bal.c 文件中,我声明了 struct List 类型的变量,并且编译器对 struct List 没有任何想法,因为 struct list 的定义位于 list.c 文件中.

所以问题又是:如何连接所有内容以使其正常工作?

最佳答案

您的头文件已损坏。这是一个不完整的类型:

typedef struct bal * Bal;

它需要 struct 声明才能使其完整。这也应该在头文件中。如果在 C 代码中您说 *Bal 而不包含完整类型,编译器会放弃,因为它没有有关此表达式含义的任何信息,即结构体的字段。

您显示的依赖关系图应该绝对没有问题。您希望使用防护来确保头文件仅包含一次。然后,您可以包含另一个 header ,只要不存在循环依赖关系,C 预处理器就会“正常工作”。在你的情况下,例如标题模块 4 如下所示:

// module4.h
#ifndef MODULE_4_H_INCLUDED
#define MODULE_4_H_INCLUDED

#include "module1.h"

// all public type declarations for module 4 types

#endif // MODULE_4_H_INCLUDED

使所有 header (包括 module1.h)相似,并具有自己的保护定义。然后是模块4代码:

// module4.c
#include "module4.h"

// Use module 4 types.

一般来说,如果您需要某些 .c 文件中的头文件给出的类型,请包含它,即使它会包含在 header 之间的依赖关系中。 guard 通常会确保没有冗余。

此外,您对建立依赖关系的想法是不正确的。例如。要成功编译module4.c得到module4.o,你需要(当然)module4.cmodule4.hmodule1.h。这些是构建依赖项。所以规则是:

module4.o : module4.c module4.h module1.h
$(CC) -g -W -Wall -c module4.c

但是你不应该编写这样的特定规则。 Make 具有更易于使用的内置规则和通用规则。您可以使用 gcc 本身来生成头文件依赖项,而不是手动跟踪它们(这可能会导致各种灾难)。请参阅the -M option .

关于C 抽象数据类型指针 - 程序模块化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29552352/

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