web-dev-qa-db-fra.com

Comment transférer la structure typedef'd dans .h

J'ai 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;
}

J'ai alors réalisé que je devais séparer les déclarations des définitions. J'ai donc créé Preprocessor.c:

#define MAX_FILES 15

struct Preprocessor {
    FILE fileVector[MAX_FILES];
    int currentFile;
};

typedef struct Preprocessor Prepro;

Et Preprocessor.h est maintenant:

void Prepro_init(Prepro* p) {
    (*p).currentFile = 0;
}

Cela ne fonctionne évidemment pas car Pr..h ne connaît pas le type Prepro. J'ai déjà essayé plusieurs combinaisons, aucune ne fonctionnait. Je ne trouve pas la solution.

24
erandros

Bouge le typedef struct Preprocessor Prepro; à l'en-tête le fichier et la définition dans le fichier c avec la définition Prepro_init. Ceci vous le transmettra sans aucun problème.

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;
}
28
Joe

Si vous souhaitez masquer la définition de Preprocessor, vous pouvez simplement le mettre dans le fichier d'en-tête:

struct Preprocessor;
typedef struct Preprocessor Prepro;

Mais plus généralement, vous aurez probablement également besoin de la définition Preprocessor dans le fichier d'en-tête, pour permettre à d'autres codes de l'utiliser réellement.

8
Sander De Dycker

Vous avez mis .c ce qui devrait être dans .h, et vice versa. Prepro_init doit être dans .c fichier, et ce fichier doit #include "Preprocessor.h".

1
hamstergene