理解函数指针的C语法

时间:2017-01-09 05:52:44

标签: c struct function-pointers

下面的代码是实现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}}

如何理解这种语法?

2 个答案:

答案 0 :(得分:2)

    void (*A)(struct A*);

,第一个A未引用typedef struct A { ... } A,因为这仅在下面进一步定义。此时,编译器对名为A的类型一无所知。 A只是结构成员的名称,就像updateaccess一样。

struct A确实引用了结构,但是:进一步有struct A;声明。)

答案 1 :(得分:0)

它们位于不同的名称空间中。

在C中有四个不同的命名空间

  • struct / union / enum的标签
  • struct / union的成员(实际上是为每个struct / union分配一个单独的命名空间)
  • 标签
  • 普通标识符。

(C90第6.1.2.3节)

不同名称空间中的标识符不会相互冲突,并且会被称为单独的实体。

所以,在你的情况下,

  • 作为函数指针的结构成员(*A)位于第二个名称空间中。
  • struct typedef struct A的标签位于第一个命名空间
  • 作为普通标识符的结构类型位于第四个名称空间中。
  • 此外,函数指针(*A)(struct A*)的函数类型位于第四个名称空间中,是普通类型。