5

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

公共广播.h

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

私人电台.h

#include <publicRadio.h>
struct _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 通过函数公开其结构,但隐藏了血淋淋的细节。实现这一目标的秘诀是什么?

4

2 回答 2

4

这种模式通常是这样实现的:

收音机.h

#ifndef RADIO_H
#define RADIO_H

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

#endif

电台.c

#include "radio.h"

struct _radio {
    // _radio struct implementation
};

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

主程序

#include "radio.h"
.... // use Radio, radioReceive, etc.
于 2012-12-18T19:40:56.160 回答
2

好的:以下在 MSVC 和 GCC 上都可以正常工作

两个重要的错误是:

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

这是我使用的代码:

公共广播.h

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

私人电台.h

    #include "publicRadio.h"

    struct _radio {
        ...
        ...
    };

电台.c

    #include "privateRadio.h"

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

主程序

    #include "publicRadio.h"

    void main()
    {
        Radio* radio = ...;
        radioReceive(radio, ....);
    }
于 2012-12-18T19:53:17.437 回答