0

我正在创建一个接口结构

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;

一切都很好。

发生这种情况时有人知道吗?提前致谢。

4

2 回答 2

2

本会员声明

U8 (*Put)(Circular_Buffer, VoidPtr);

如果在源代码中既没有Circular_Buffer也没有VoidPtr定义, 则可以正常工作。typedefU8但必须定义。)这是因为它将被接受为 K&R 风格的函数声明,它指定参数的名称但不指定参数的类型。(也就是说,Put将被声明为一个指向带有两个未指定类型参数的函数的指针。)

如果两者都定义为 s,它也将起作用Circular_BufferVoidPtrtypedef这种情况下,它将被视为正常的标准 C 声明。

如果使用 编译-Wall,第一种情况可能会产生警告。-Wall总是推荐

如果只有两个标识符中的一个被声明为 a ,它应该无法编译typedef,所以我不知道typedef void* VoidPtr在成员声明之前和typedef struct ... Circular_Buffer之后的情况下它是如何工作的。也许这是旧版本 gcc 的一个不起眼的功能。(一旦编译器确定它是 K&R 函数声明,则可以忽略实际参数名称,除非它是函数定义,并且在该行出现的上下文中,它不能是函数定义。)

于 2015-11-11T23:07:17.740 回答
0

带有 的第一个声明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

Apple 版本的 clang 也是如此。因此,我怀疑问题出在您的 C 编译器上,而不是您的代码上。

于 2015-11-11T21:06:32.610 回答