我想知道:如果标题已经隐式包含,是否应该将标头包含在文件中?例如
dataStructure.h
#ifndef DATASTRUCTURE_H
#define DATASTRUCTURE_H
typedef struct MyStruct_ {
int number;
... // other members
} MyStruct;
#endif
utils.h
#ifndef UTILS_H
#define UTILS_H
#include "dataStructure.h"
int GetSize(MyStruct* my_struct);
int PrimeNumber(int my_struct_number);
#endif
main.c
#include "utils.h"
// utils.h includes `dataStructure.h` but should I include it again here?
int main() {
MyStruct my_struct;
... // initialise my_struct
if (PrimeNumber(my_struct.number)) {
printf("%d is primen", my_struct.number);
}
}
如果以后GetSize
方法utils.h
文件中删除,则utils.h
不再需要包含dataStructure.h
。然后经过这些修改后,突然main.c
没有dataStructure.h
标头就无法编译。
一个现实生活中的例子是,如果这很可能被隐式包含在其他某个头文件中,并且代码在没有额外包含的情况下编译,则是否包含使用NULL
指针的<stdlib.h>
。
如果文件已隐式包含,这些示例是否说明了重新包含文件的理由?
如果满足某些条件,您可以根据需要多次包含头文件:
.h
文件受定义保护(代码缺少保护)。它确保 .h 文件的正文在每个编译单元中仅编译一次。
#ifndef DATASTRUCTURE_h
#define DATASTRUCTURE_h
/* the content of the .h file */
#endif
- 除了静态内联函数外,您的代码不包含任何数据或函数定义。它可以包含
extern
对象声明和函数原型以及数据类型声明。
好不好?就我个人而言,我更愿意看看哪个特定的编译单元会使用接受与多预处理相关的惩罚。