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

时间:2012-12-18 19:24:23

标签: c

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

publicRadio.h

typedef struct _radio Radio;
void radioReceive(Radio *radio, ....);

privateRadio.h

#include <publicRadio.h>
struct _radio {
    ...
    ...
}

radio.c

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

void radioReceive(Radio *radio, ....)
{
    ...
}

当我尝试编译时,我会得到像

这样的东西
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

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

2 个答案:

答案 0 :(得分:4)

此模式通常如下实现:

radio.h

#ifndef RADIO_H
#define RADIO_H

typedef struct _radio Radio;
void radioReceive(Radio *radio, ....);

#endif

radio.c

#include "radio.h"

struct _radio {
    // _radio struct implementation
};

void radioReceive(Radio *radio, ....) {
    // radioReceive implementation
}

main.c中

#include "radio.h"
.... // use Radio, radioReceive, etc.

答案 1 :(得分:2)

确定:以下 在MSVC和GCC上都可以正常工作。

两个重要的错误是:

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

以下是我使用的代码:

publicRadio.h

    typedef struct _radio Radio;
    void radioReceive(Radio *radio, ....);

privateRadio.h

    #include "publicRadio.h"

    struct _radio {
        ...
        ...
    };

radio.c

    #include "privateRadio.h"

    void radioReceive(Radio *radio, ....)
    {
        ...
    }

main.c中

    #include "publicRadio.h"

    void main()
    {
        Radio* radio = ...;
        radioReceive(radio, ....);
    }