我正在尝试构建一些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通过函数公开它们的结构,但隐藏了血腥的细节。用来实现这一目的的食谱是什么?
答案 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上都可以正常工作。
两个重要的错误是:
以下是我使用的代码:
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, ....);
}