对在头文件中实例化指针感到困惑

Confused about instantiating a pointer in the header file

本文关键字:指针 实例化 文件      更新时间:2023-10-16

我正在读一本书,它阐述了在头文件中放入内容的以下原则:

"你可以在头文件中放入什么规则是"仅声明",也就是说,仅向编译器提供信息但没有通过生成代码或创建变量。这是因为通常会包含头文件在一个项目的几个翻译单元中,如果存储一个标识符被分配在多个位置,链接器将出现多重定义错误。。。"

然而,它给出了这样一个头文件的例子:

#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结构的范围内使用。

如果我继续讲下去,我会听起来像这个线程,我会把你的注意力委托给它。理解头文件的想法总是一个棘手的障碍。

相关文章: