c - 在结构定义内的函数指针内使用 void* 作为参数会导致语法错误

标签 c powerpc codewarrior

我正在创建一个界面结构

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 也可以正常工作也不VoidPtrtypedef 定义在源代码中的那一点。 (尽管必须定义 U8。)这是因为它将被接受为 K&R 风格的函数声明,它指定参数的名称而不是它们的类型。 (也就是说,Put 将被声明为一个指向带有两个未指定类型参数的函数的指针。)

如果 Circular_BufferVoidPtr定义为 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/

相关文章:

c - 将变量传递给函数会更改 C 中的地址位置

c - posix mqueue 中的错误文件描述符

linux - 在 Linux-PowerPC 上使用 GCC 连接到 DB2/400

c++ - "vperm v0,v0,v0,v17"和未使用的 v0 有什么作用?

linux - DMA 引擎在 PowerPC Linux 上无法正确响应

c - 如何从 C 中的现有变量创建位域

C 全局在 ISR 中声明

c - 我需要编写一个 C 程序来调用给定函数来计算文件中的字符和数字的数量

c - 使用C语言中的套接字向FTP服务器发送命令

c++ - 如何将 CFString 转换为 HFSUniStr255?