如何声明一个不透明的结构指针接口

Tra*_*ggs 5 c

我正在尝试构建一些C代码,使得.c文件和私有.h文件定义了一个相当复杂的结构,但是面向公众的头文件只需要指向该结构类型的指针.我试过的是这个:

publicRadio.h

typedef struct _radio Radio;
void radioReceive(Radio *radio, ....);
Run Code Online (Sandbox Code Playgroud)

privateRadio.h

#include <publicRadio.h>
struct _radio {
    ...
    ...
}
Run Code Online (Sandbox Code Playgroud)

radio.c

#include <publicRadio.h>
#include <privateRadio.h>

void radioReceive(Radio *radio, ....)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,我会得到类似的东西

radio.c:91:9: error: parameter 'radio' has just a forward declaration
radio.c:90:6: error: conflicting types for 'radioReceive'
publicRadio.h:29:6: note: previous declaration of 'radioReceive' was here
Run Code Online (Sandbox Code Playgroud)

我试图模仿我在其他具有公共面向API的库中看到的模式,这些API通过函数公开它们的结构,但是隐藏了血腥的细节.用来实现这一目的的食谱是什么?

Kev*_*udé 2

好的:以下内容在 MSVC 和 GCC 上都可以正常工作,没有问题。

两个重要的错误是:

  • privateRadio.h 中缺少分号
  • 在 radio.c 中包含 publicRadio.h 会导致双重包含。它已经包含在 privateRadio.h 中

这是我使用的代码:

公共广播.h

    typedef struct _radio Radio;
    void radioReceive(Radio *radio, ....);
Run Code Online (Sandbox Code Playgroud)

私有Radio.h

    #include "publicRadio.h"

    struct _radio {
        ...
        ...
    };
Run Code Online (Sandbox Code Playgroud)

无线电.c

    #include "privateRadio.h"

    void radioReceive(Radio *radio, ....)
    {
        ...
    }
Run Code Online (Sandbox Code Playgroud)

主程序

    #include "publicRadio.h"

    void main()
    {
        Radio* radio = ...;
        radioReceive(radio, ....);
    }
Run Code Online (Sandbox Code Playgroud)