#define MAX_FILES 15
struct Preprocessor {
FILE fileVector[MAX_FILES];
int currentFile;
};
typedef struct Preprocessor Prepro;
void Prepro_init(Prepro* p) {
(*p).currentFile = 0;
}
然后我意识到我必须将声明与定义分开。所以我创建了Preprocessor.c:
#define MAX_FILES 15
struct Preprocessor {
FILE fileVector[MAX_FILES];
int currentFile;
};
typedef struct Preprocessor Prepro;
Preprocessor.h现在是:
void Prepro_init(Prepro* p) {
(*p).currentFile = 0;
}
显然,这是行不通的,因为Pr..h不知道Prepro类型。我已经尝试过几种组合,但都没有。我找不到解决方案。
答案 0 :(得分:25)
将typedef struct Preprocessor Prepro;
移动到文件的标题和c文件中的定义以及Prepro_init定义。这将是向前宣布它没有问题。
Preprocessor.h
#ifndef _PREPROCESSOR_H_
#define _PREPROCESSOR_H_
#define MAX_FILES 15
typedef struct Preprocessor Prepro;
void Prepro_init(Prepro* p);
#endif
Preprocessor.c
#include "Preprocessor.h"
#include <stdio.h>
struct Preprocessor {
FILE fileVector[MAX_FILES];
int currentFile;
};
void Prepro_init(Prepro* p) {
(*p).currentFile = 0;
}
答案 1 :(得分:8)
如果你想隐藏Preprocessor
的定义,你可以简单地把它放在头文件中:
struct Preprocessor;
typedef struct Preprocessor Prepro;
但更一般地说,您可能还需要头文件中的Preprocessor
定义,以允许其他代码实际使用它。
答案 2 :(得分:1)
您已将.c
中的内容放入.h
,反之亦然。 Prepro_init
必须位于.c
文件中,该文件必须为#include "Preprocessor.h"
。
答案 3 :(得分:-1)
YAS:又一个解决方案。
Preprocessor.h
<some code>
void Prepro_init(Prepro* p) {
(*p).currentFile = 0;
}
<some code>
Preprocessor.c
#define MAX_FILES 15
struct Preprocessor {
FILE fileVector[MAX_FILES];
int currentFile;
};
typedef struct Preprocessor Prepro;
#include "Preprocessor.h" //include after defining your structure.
<some code>
{
struct Prepro p;
Prepro_init(p);
<some code>
.... using p.currentFile.....
.....using other members....
<some code>
}
<some code>
现在它会起作用。我认为这是你的要求。希望它有所帮助。
<强>缺点:强> 结构预处理器的成员必须是预定的。即头文件使用成员currentFile。因此,包含Preprocessor.h的c文件必须具有类型定义为Prepro的结构,并且该结构必须包含成员currentFile。(在本例中)。
我在一年前遇到的同样问题,同时编写头文件以图形树格式显示用户Avl树。
答案 4 :(得分:-1)
我建议您遵循Linus [1],不要使用typedef struct。
包含文件
struct Foo;
int foo_get_n(const struct Foo *bar);
在实施档案
中struct Foo
{int n;};
int foo_get_n(const struct Foo *bar)
{return bar->n;}
要求维护者从包含文件中删除这些污染类型的定义。
不要使用typedef struct。
答案 5 :(得分:-2)
交换.h
和.c
文件。在.c
中添加标题。
另请参阅有关声明,定义和头文件的书籍。