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

标签 gcc struct declare

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

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

最佳答案

struct a *a1;

a1声明为指向struct a指针。您可以合法地声明一个指针 转换为不完整的 struct 类型 a,因为编译器不需要知道 定义struct a来创建一个指向它的指针。所有指向struct的指针 类型具有相同的内存表示和对齐要求,那就是 编译器需要知道创建一个的所有信息。您的任务:

a1 = 0;

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

a1->member = 0;

需要编译器有struct a的定义,而你 会看到编译失败,例如:

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

稍后

Where do I need use this syntax? Usually what does undefined struct be used for?

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

关于gcc - 未定义的结构名称可用于声明新的结构变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51037904/

相关文章:

c - 在C中对结构数组进行排序

C fscanf 和指针

用作结构字段或结构方法

oracle - pl/sql中如何选择行表数据

c - 在 C 的头文件中声明 static const 变量是否是可接受的做法

c++ - 我无法在 namespace 范围内使用全局名称 (gcc) 声明函数

c++ - C/C++ 重复符号错误

C++ 将用户输入作为数组的维数?

c - 如何访问 C 变量以进行内联汇编操作?

c - 将多个库静态链接成一个 .so