未定义的结构名称可用于声明新的结构变量

时间:2018-06-26 08:07:06

标签: gcc struct declare

我没有定义结构a,但是我可以使用结构a声明变量。以下代码可以由GCC在Linux上编译,因此,结构a的成员是什么? a仅被识别为char *吗?我不知道这是什么意思。

void main() {
    struct a *a1;
    a1 = 0;
}

1 个答案:

答案 0 :(得分:2)

struct a *a1;

a1声明为struct a指针。您可以合法地声明一个指针 到不完整的struct类型a,因为编译器不需要知道 struct a的定义以为其创建 pointer 。所有指向struct的指针 类型具有相同的内存表示和对齐要求,那就是 创建一个编译器所需的所有知识。您的作业:

a1 = 0;

只需将 pointer 设置为0,即使其成为空指针。它假定什么都没有 关于指针可能指向的对象的类型。相反,如果您要 尝试类似的东西:

a1->member = 0;

将要求编译器具有struct a的定义,而您 会看到类似的编译失败:

main.c:3:7: error: dereferencing pointer to incomplete type ‘struct a’
     a1->member = 0;
       ^

稍后

  

我在哪里需要使用此语法?通常,未定义的结构用于什么?

不完整struct指针的经典用法是实现抽象数据类型 通过头文件公开的C API是根据“不透明” struct指针定义的  -指向不完整类型的指针-以便客户端可以查询 只能通过API来操作和处理这些指针寻址的对象,而不能 规避它以未经批准的方式处理对象,因为它们看不到 不透明指针指向的数据类型的定义!这是一个elementary example from the C FAQ