我的 fifo.c 文件中有fifo_t
类型定义,如下所示。在头文件 fifo.h 中应该声明什么类型?我想让这个结构的内容只在 fifo.c 文件中知道。此外,我不希望能够通过struct struct_name var;
创建此结构的实例。只有有效的方式应该是fifo_t var;
typedef struct {
uint8_t *buffer,
uint8_t indexRead,
uint8_t indexWrite,
uint8_t used,
uint8_t size
} fifo_t;
答案 0 :(得分:4)
如果您只想将指针传递给fifo_t
,那么您只能在头文件中转发声明它。但是,对于未命名的结构,typedef
仅在您定义结构的内容时才有效。因此,如果您不想编译struct fifo_t var;
,则必须使用一些反直觉的名称,可能类似于fifo_t_
。例如:
typedef struct fifo_t_ fifo_t;
void fifo_use(fifo_t*); // ok, just uses pointer
然后在.c
文件中,执行(请注意,使用逗号分隔成员并不是有效的语法):
struct fifo_t_ {
uint8_t *buffer;
uint8_t indexRead;
uint8_t indexWrite;
uint8_t used;
uint8_t size;
};
void fifo_use(fifo_t* f) {
f->indexRead = 1;
}
另外,请注意fifo_t var;
无法正常工作,因为您需要知道结构的大小才能为其分配空间。您可能做的事情是在内部使用指针,以对用户透明的方式:
// in .h file:
typedef struct fifo_t_* fifo_t;
void fifo_init(fifo_t*);
void fifo_free(fifo_t);
void fifo_use(fifo_t);
// in .c file:
struct fifo_t_{
uint8_t *buffer;
uint8_t indexRead;
uint8_t indexWrite;
uint8_t used;
uint8_t size;
};
void fifo_init(fifo_t* f) {
*f = (fifo_t)malloc(sizeof(struct fifo_t_));
}
void fifo_free(fifo_t f) {
free(f);
}
void fifo_use(fifo_t f) {
f->indexRead = 1;
}
// somewhere else
int main() {
fifo_t fifo;
fifo_init(&fifo);
fifo_use(fifo);
fifo_free(fifo);
}
答案 1 :(得分:0)
如果您希望能够在fifo_t
等堆栈上创建fifo_t var;
,则无法隐藏sizeof(fifo_t)
的内容,因为fifo_t
未知
您可以在标题struct fifo_t;
中对fifo_t
进行forvard声明。在其他文件中,您可以为fifo_t *var;
create(&var);
do_work(var);
destroy(var);
创建poiners,并使用应在fifo.c中实现的函数与它们一起使用
class Test_File(unittest.TestCase):
def test_$FILE_NAME(self):
return_val = validate_data($FILE_NAME)
assert return_val
答案 2 :(得分:0)
如果你想在 fifo.h 中定义结构,那么这就是要走的路:
<强> fifo.h 强>
...
#ifdef FIFO
typedef struct {
uint8_t *buffer,
uint8_t indexRead,
uint8_t indexWrite,
uint8_t used,
uint8_t size
} fifo_t;
#else
...
#endif
...
<强> fifo.c 强>
#define FIFO
#include "fifo.h"
...
所以 fifo.h 仍然可以包含在其他源文件中,但结构类型为hide,只有 fifo.c
才能显示