使用一个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; 

一切符合就好了。

有没有人有这方面的线索? 在此先感谢。

+1

什么语法错误?哪个C编译器/标准?这里没有C99的问题:http://ideone.com/6rhO8r – rici

+1

当然'Circular_Buffer'应该事先定义好,可能是一个指针。除此之外,我同意@rici。 – Rhialto

+0

我为Windows使用极简主义GNU(mingw32) - 启用C99扩展 – richardnixonthethird

该成员声明如果既不Circular_Buffer也不VoidPtr在源代码中的该点与typedef定义

U8 (*Put)(Circular_Buffer, VoidPtr); 

将正常工作。 (但是,必须定义U8)。这是因为它将被接受为R-style函数声明,它指定参数的名称,但不指定它们的类型。 (即,Put将被宣布为指针采取未指定的类型的两个参数的函数。)

如果两个Circular_BufferVoidPtr被定义为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编译器上,而不是用你的代码。

+1

或者'Circular_Buffer'的定义存在问题。 – user3386109

+2

我的代码是否为你编译?如果没有,你会得到什么错误信息? – jochen

+0

遵守您的代码。你可以看看我如何定义Circular_Buffer的编辑 – richardnixonthethird