【问题标题】:Undefined struct name can be used to declare new struct variable未定义的结构名称可用于声明新的结构变量
【发布时间】:2018-06-26 08:07:06
【问题描述】:

我还没有定义结构a,但是我可以用结构a 声明变量。以下代码可以通过 GCC 在 Linux 上编译,那么 struct a 的成员是什么? a 是否被识别为 char * ?不知道是什么意思。

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

【问题讨论】:

    标签: gcc struct declare


    【解决方案1】:
    struct a *a1;
    

    a1 声明为指向struct a指针。你可以合法地声明一个指针 到一个不完整的 struct 类型 a 因为编译器不需要知道 struct a 的定义以创建指向它的 指针。所有指向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;
           ^
    

    稍后

    我在哪里需要使用这种语法?通常 undefined struct 是做什么用的?

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

    【讨论】:

    • 谢谢,我在哪里需要使用这个语法?通常未定义的结构用于什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2021-12-17
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多