- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果某个模块依赖于其他子模块,或者将其包含在其头文件中或代码文件中,那么如果模块除了对主程序有贡献之外还相互依赖怎么办?
下图示意性地说明了 module1.h/.c 需要子模块 module4.h,而 module2 需要 module3 的情况。
每个头文件都有自己的 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.c
、module4.h
和 module1.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/
我有一个包含几个模块的程序,比如:moduleA、moduleB 和 moduleC。 而且我还有一个头文件 debug_flags.h 我在其中定义了三个宏: #define DEBUG_MODUL
我是一名优秀的程序员,十分优秀!