未定义的结构名称可用于声明新的结构变量
Undefined struct name can be used to declare new struct variable
我没有定义结构 a
,但是我可以用结构 a
声明变量。 GCC 可以在 Linux 上编译以下代码,那么,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;
that 将要求编译器定义 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 是根据 "opaque" struct
指针定义的
- 指向不完整类型的指针 - 以便客户端可以查询
并且只能通过 API 操作这些指针寻址的对象,不能
绕过它以未经批准的方式处理对象,因为他们看不到
不透明指针指向的数据类型的定义!这是一个 基本示例
来自 C 常见问题
我没有定义结构 a
,但是我可以用结构 a
声明变量。 GCC 可以在 Linux 上编译以下代码,那么,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;
that 将要求编译器定义 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 是根据 "opaque" struct
指针定义的
- 指向不完整类型的指针 - 以便客户端可以查询
并且只能通过 API 操作这些指针寻址的对象,不能
绕过它以未经批准的方式处理对象,因为他们看不到
不透明指针指向的数据类型的定义!这是一个 基本示例
来自 C 常见问题