我正在创建一个界面结构
typedef struct Circular_Buffer_Interface_t * Circular_Buffer_Interface;
typedef struct Circular_Buffer_Interface_t {
U8 (*Put)(Circular_Buffer, void*);
U8 (*Get)(Circular_Buffer, void*);
U8 (*Reset)(Circular_Buffer);
BOOL (*isFull)(Circular_Buffer);
BOOL (*isEmpty)(Circular_Buffer);
} Circular_Buffer_Interface_t;
typedef struct Circular_Buffer_t * Circular_Buffer;
typedef struct Circular_Buffer_t {
Circular_Buffer_Interface Interface;
} Circular_Buffer_t;
我的问题是,当我尝试编译为什么使用 void* 作为函数参数时会抛出语法错误。
如果我使用 typedef
typedef void* VoidPtr
然后使用
typedef void* VoidPtr;
typedef struct Circular_Buffer_Interface_t {
U8 (*Put)(Circular_Buffer, VoidPtr);
U8 (*Get)(Circular_Buffer, VoidPtr);
U8 (*Reset)(Circular_Buffer);
BOOL (*isFull)(Circular_Buffer);
BOOL (*isEmpty)(Circular_Buffer);
} Circular_Buffer_Interface_t;
一切正常。
发生这种情况时,有人知道吗? 提前致谢。
最佳答案
本成员声明
U8 (*Put)(Circular_Buffer, VoidPtr);
如果两者都没有 Circular_Buffer
也可以正常工作也不VoidPtr
用 typedef
定义在源代码中的那一点。 (尽管必须定义 U8
。)这是因为它将被接受为 K&R 风格的函数声明,它指定参数的名称而不是它们的类型。 (也就是说,Put
将被声明为一个指向带有两个未指定类型参数的函数的指针。)
如果 Circular_Buffer
和 VoidPtr
定义为 typedef
s,在这种情况下,它将被视为正常的标准 C 声明。
如果使用 -Wall
编译,第一种情况可能会产生警告。 -Wall
总是推荐。
如果两个标识符中只有一个被声明为 typedef
,它应该编译失败,所以我不知道在 typedef void* VoidPtr
的情况下它是如何工作的出现在成员声明之前,并且typedef struct ... Circular_Buffer
之后来。也许这是旧版本 gcc 的一个模糊特性。 (一旦编译器确定它是一个 K&R 函数声明,实际的参数名称就可以被忽略,除非它是一个函数定义,并且在该行出现的上下文中,它不能是一个函数定义。)
关于c - 在结构定义内的函数指针内使用 void* 作为参数会导致语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33659555/