我正在读一本书,它阐述了在头文件中放入内容的以下原则:
"你可以在头文件中放入什么规则是"仅声明",也就是说,仅向编译器提供信息但没有通过生成代码或创建变量。这是因为通常会包含头文件在一个项目的几个翻译单元中,如果存储一个标识符被分配在多个位置,链接器将出现多重定义错误。。。"
然而,它给出了这样一个头文件的例子:
#ifndef STACK_H
#define STACK_H
struct Stack
{
struct Link
{
void* data;
Link* next;
void initialize(void* dat, Link* nxt);
} *head;
...
};
#endif
变量"head"不是一个对象,违反了这个规则吗?即使它是一个指针,如果多个编译单元包括这个头文件,导致"多定义",它也会占用存储空间并导致问题?
您正在声明一个成员变量。即使它不是指针,也不是问题。它是类(结构)声明的一部分。
只有当您实例化类型为Stack
的对象时,才会实际进行存储分配。
在决定需要将什么放入头文件时,脑海中应该浮现的问题是"这需要事先定义吗?"。在查看实现之前,需要了解用户定义的对象(结构和类)和方法(函数)定义的定义,然后才能在实现中调用它们。
头文件中包含什么
- 数据的定义
- 方法的定义
- 全局变量的分配(有时)
在这种情况下,不会分配任何内容。您在这里所说的是,我们将Stack定义为包含一个成员,该成员是指向链接的指针。当然,我们还需要定义链接,它被定义为在Stack结构的范围内使用。
如果我继续讲下去,我会听起来像这个线程,我会把你的注意力委托给它。理解头文件的想法总是一个棘手的障碍。