使用一个void *作为结构定义中一个函数指针内的参数会导致
我创建的界面结构使用一个void *作为结构定义中一个函数指针内的参数会导致
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;
我的问题是,当我尝试,为什么使用无效编译*作为函数语法错误它引发了一个语法错误。
如果我使用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;
一切符合就好了。
有没有人有这方面的线索? 在此先感谢。
该成员声明如果既不Circular_Buffer
也不VoidPtr
在源代码中的该点与typedef
定义
U8 (*Put)(Circular_Buffer, VoidPtr);
将正常工作。 (但是,必须定义U8
)。这是因为它将被接受为R-style函数声明,它指定参数的名称,但不指定它们的类型。 (即,Put
将被宣布为指针采取未指定的类型的两个参数的函数。)
如果两个Circular_Buffer
和VoidPtr
被定义为typedef
秒,在这种情况下,将被视为一个还将工作正常的标准C声明。
如果用-Wall
进行编译,第一种情况可能会产生警告。 -Wall
是总是推荐。
应该编译失败如果只有两个标识符的一个声明为typedef
,所以我不知道它是如何工作的情况下typedef void* VoidPtr
而来的成员声明之前,和typedef struct ... Circular_Buffer
来算账。也许这是旧版gcc的一个晦涩难懂的功能。 (一旦编译器确定它是R函数声明,实际参数名称可以被忽略,除非它是函数定义,并且在出现该行的上下文中,它不能是函数定义。)
第一个声明,与void *
,似乎我添加了一些代码,使之成为完整的程序完全合法C.:
#include <stdio.h>
typedef int U8;
typedef int BOOL;
typedef int Circular_Buffer;
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;
int main() {
puts("hello");
}
这项计划成功,没有MacOSX上用GNU C版本5.2警告编译:
> gcc-5 -std=c99 -Wall x.c
> ./a.out
hello
同样适用于苹果版的铿锵声。因此我怀疑问题出在你的C编译器上,而不是用你的代码。
或者'Circular_Buffer'的定义存在问题。 – user3386109
我的代码是否为你编译?如果没有,你会得到什么错误信息? – jochen
遵守您的代码。你可以看看我如何定义Circular_Buffer的编辑 – richardnixonthethird
什么语法错误?哪个C编译器/标准?这里没有C99的问题:http://ideone.com/6rhO8r – rici
当然'Circular_Buffer'应该事先定义好,可能是一个指针。除此之外,我同意@rici。 – Rhialto
我为Windows使用极简主义GNU(mingw32) - 启用C99扩展 – richardnixonthethird