我正在读一本书,它说明了在头文件中添加内容的以下原则:
“你可以把什么放入头文件?基本的 rule是“only declarations”,也就是说,只有编译器的信息 但没有通过生成代码或创建来分配存储的任何东西 变量。这是因为通常会包含头文件 在项目的几个翻译单元中,如果存储为一个 标识符分配在多个位置,链接器将出现多重定义错误...“
但是,它会给出一个这样的头文件的例子:
#ifndef STACK_H
#define STACK_H
struct Stack
{
struct Link
{
void* data;
Link* next;
void initialize(void* dat, Link* nxt);
} *head;
...
};
#endif
变量“head”不是一个对象并且违反了这个规则吗?即使它是一个指针,如果多个编译单元包含此头文件导致“多重定义”,它将占用存储并导致问题?
答案 0 :(得分:2)
您正在声明成员变量。即使它不是指针也不是问题。它是类(结构)声明的一部分。
只有在实例化Stack
类型的对象时,才会实际进行存储分配。
答案 1 :(得分:0)
在决定需要放入头文件的内容时,应该在脑中运行的问题是“这是否需要事先定义?”。在查看实现之前,需要知道用户定义的对象(结构和类)和方法(函数)定义的定义,然后才能在实现中调用它们。
标题文件中包含哪些内容?
在这种情况下,没有分配任何内容。你在这里说的就是我们定义Stack包含一个指向链接的成员。当然,我们还需要定义链接,链接被定义为使用Stack结构的范围。
如果我继续,我会听起来像this thread,我将把你的注意力集中在那里。理解头文件的想法,总是一个棘手的障碍。