Подтвердить что ты не робот

Как перенаправить 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. Я уже пробовал несколько комбинаций, никто из них не работал. Я не могу найти решение.

4b9b3361

Ответ 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.

Также см. книгу о декларациях, определениях и файлах заголовков.