Как перенаправить typedef'd структуру в .h
У меня есть
Preprocessor.h
#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. Я уже пробовал несколько комбинаций, никто из них не работал. Я не могу найти решение.
Ответы
Ответ 1
Переместите 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;
}
Ответ 2
Если вы хотите скрыть определение Preprocessor
, вы можете просто поместить его в заголовочный файл:
struct Preprocessor;
typedef struct Preprocessor Prepro;
Но в более общем плане вам, вероятно, также понадобится определение Preprocessor
в файле заголовка, чтобы позволить другому коду фактически использовать его.
Ответ 3
Вы положили .c
то, что должно быть в .h
, и наоборот. Prepro_init
должен находиться в файле .c
, и этот файл должен #include "Preprocessor.h"
.
Ответ 4
Я предлагаю вам следовать за 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 из включенных файлов.
Резюме
Не используйте typedef struct.
[1] http://yarchive.net/comp/linux/typedefs.html
Ответ 5
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>
Теперь это сработает. Я думаю, это ваше требование. Надеюсь, что это поможет.
Минус:Элементы структуры Preprocessor должны быть предопределены. т.е. в файле заголовка используется элемент currentFile. Таким образом, файл c, который включает в себя Preprocessor.h, должен иметь структуру, которая вводится как Prepro, и эта структура должна включать член currentFile (в этом случае).
Та же проблема, что и у меня год назад, при написании файла заголовка для отображения дерева пользователей Avl в формате графического дерева.
Ответ 6
Сменить .h
и .c
файл. Включить заголовок в .c
.
Также см. книгу о декларациях, определениях и файлах заголовков.