首页 > 解决方案 > 为什么我可以在声明之前使用结构类型的指针

问题描述

为什么我可以在没有任何声明的情况下编译下面的代码?

struct node *n;

int main()
{
  return 0;
}

我没有包含任何标题。这是正常的吗?

标签: ccompiler-errorsoperating-system

解决方案


指针定义充当 的前向声明struct node只要在实际结构定义出现之前未取消引用指针,就允许使用这样的声明。

这是允许这样的构造所必需的:

struct list_node {
    int value;
    struct list_node *next;
};

这是链表中节点的典型定义。该next字段的类型为struct list_node *,但此时struct list_node尚未完全定义。如果不允许这样的前向声明,那么这样的构造是不可能的。

您还可以使用这样的指针传递给函数并获取返回值。例如:

struct node *n = new_node();
set_node_value(n, 1);

这两个函数可以在一个单独的源文件中定义,其中的完整定义struct node是已知的。这种情况下的结构是一种不透明的类型,图书馆的用户不需要知道它的细节。


推荐阅读