下面的代码是实现vtable。
在下面的代码中,
struct A;
typedef struct {
void (*A)(struct A*);
void (*update)(struct A*);
int (*access)(struct A*);
} A_functable;
typedef struct A{
int a;
A_functable *vmt;
} A;
我无法理解(*A)
中的void (*A)(struct A*);
作为A_functable
成员的A
中的函数指针,其中 typedef struct A{
int a;
A_functable *vmt;
} A;
是
{{1}}
如何理解这种语法?
答案 0 :(得分:2)
在
void (*A)(struct A*);
,第一个A
未引用typedef struct A { ... } A
,因为这仅在下面进一步定义。此时,编译器对名为A
的类型一无所知。 A
只是结构成员的名称,就像update
和access
一样。
(struct A
确实引用了结构,但是:进一步有struct A;
声明。)
答案 1 :(得分:0)
它们位于不同的名称空间中。
在C中有四个不同的命名空间
(C90第6.1.2.3节)
不同名称空间中的标识符不会相互冲突,并且会被称为单独的实体。
所以,在你的情况下,
(*A)
位于第二个名称空间中。 typedef struct A
的标签位于第一个命名空间(*A)(struct A*)
的函数类型位于第四个名称空间中,是普通类型。