2012-03-06 2 views
0

J'ai eu un problème avec l'inclusion de fichiers. Ce que j'ai essentiellement fait est un programme de ligne de commande en C qui fonctionne avec un fichier csv. Il a 5 commandes: -menu, -add, -edit, -del, -verify. Tout est bon sauf pour le menu. Ce qui doit arriver quand je tape "./passweb -menu" est pour qu'un menu visuel apparaisse. Cette commande de menu devrait appeler une nouvelle fonction et elle doit être située dans un fichier c séparé (alias menu.c). Le problème que j'ai en ce moment est que je ne sais pas trop comment inclure les fichiers à exécuter dans le menu.c parce que la façon dont je l'ai configuré en ce moment, passweb.c a toutes les fonctions comme -add et -edit et etc. Je sais que vous devez faire des fichiers d'en-tête et autres, mais il se plaint que j'ai déclaré les méthodes deux fois ce qui est vrai puisque j'utilise les fonctions dans le fichier menu.#including files

est ici une partie du code:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "cipher.h" 
#include "menu.h" 
#include "passweb.h" 
#define MAXLENGTH 51 //longest length of a single record + 1 =51 bytes 
#define SIZEOFDB 1000 
#define ENCRYPT 5 

typedef struct rec 
{ 
    char name[MAXLENGTH]; 
    char pw[MAXLENGTH]; 
    char type[6]; 
    int boolean; 
}RECORD; 

int add(char *nName, char *nPw, char *nType, RECORD *arr, int size); 
void del (char *tName, RECORD *arr, int size); 
int edit(char *nName, char *nPw, char *nType, char *tName, char *tPw, RECORD *arr, int size); 
int verify (char *tName, char *tPw, RECORD *arr,int size); 

Ceci est mon fichier principal « passweb.c » et il a déclaré que les fonctions. Plus tard dans la partie principale, j'appellerai une fonction de menu qui se trouve dans un fichier menu.c. Dans la fonction de menu j'utilise "ajouter", "éditer", "del" et etc que j'ai écrit dans ce fichier. Comme vous pouvez le voir en haut, j'ai inclus les fichiers d'en-tête.

Que puis-je faire pour résoudre ce problème? Désolé pour le post long.

Merci

+0

Quel est votre message d'erreur exact? Que contient le fichier d'en-tête contenant la déclaration en double? –

+0

'passweb.c: erreur: types contradictoires pour 'ajouter' ' passweb.h: 12: erreur: déclaration précédente de 'ajouter' était ici' Ceux-ci viennent pour chaque fonction. Est-ce que ça fonctionne si j'utilise une fonction créée dans, par exemple, main.c qui exécute une fonction dans le menu.c, puis menu.c exécute une fonction créée main.c? –

+0

OK, c'est mieux. Vous déclarez la fonction deux fois. Une fois dans le fichier d'en-tête et une fois dans le fichier C Vous ne pouvez déclarer quelque chose qu'une seule fois par unité de traduction. –

Répondre

1

Vous devez mettre la fonction prototype dans le fichier d'en-tête. Vous devriez mettre son implémentation dans le fichier source, qui devrait inclure le fichier d'en-tête.

Par exemple, l'en-tête (test.h) aurait les définitions de structure et des prototypes fonctionnels tels que:

#ifndef TEST_H 
#define TEST_H 
struct myStruct { 
    int x; 
}; 

int Add(int lhs, int rhs); 
#endif 

Et la source aurait:

#include "test.h" 
#include <stdio.h> 
int Add(int lhs, int rhs) 
{ 
    return lhs+rhs; 
} 
int main() 
{ 
    printf("%d",Add(2,3)); 
    return 0; 
} 
+0

Si je les ai dans le fichier d'en-tête, cela signifie-t-il que je n'ai pas besoin de prototypes dans le fichier c? –

+0

@YamatoC - si vous avez quoi dans l'en-tête, l'implémentation? Si vous avez l'implémentation dans l'en-tête, vous n'avez besoin de rien d'autre que le 'include' dans le fichier' .c'. – prelic

+0

Je veux dire que j'ai aussi les prototypes dans le fichier d'en-tête. Est-ce que cela signifie que je n'ai pas besoin des prototypes dans le fichier dans lequel ils sont implémentés? –

1

mettre ceci dans votre fichier d'en-tête et comprennent il:

#ifndef FUNCS_H_ 
#define FUNCS_H_ 

int add(char *nName, char *nPw, char *nType, RECORD *arr, int size); 
void del (char *tName, RECORD *arr, int size); 
int edit(char *nName, char *nPw, char *nType, char *tName, char *tPw, RECORD *arr, int size); 
int verify (char *tName, char *tPw, RECORD *arr,int size); 

#endif /*FUNCS_H_*/ 

le #ifdef protège l'en-tête de mult inclusion IPLE

1

Déplacer la déclaration de add, del, edit et verify dans un nouveau fichier include main.h

Inclure main.h dans votre fichier principal .c et menu.c

En général, est aussi une bonne idée de mettre des directives dans les fichiers include qui indiquent au préprocesseur de ne les utiliser qu'une seule fois - Visual C++ a une directive spéciale #pragma once pour cela, sinon vous pouvez utiliser

#if ! __MENU_C 
#define __MENU_C 

. . . . 

#endif 
1

Le fichier d'en-tête doit contenir vos prototypes de fonctions et les informations nécessaires sur les types de données auxquels ils font référence, tels que vos définitions de structure. Il peut également inclure #define 'constantes, fonctions inline, déclarations de extern variables (qui seraient déclarées normalement dans l'un de vos fichiers .c), etc.Une fois que vous avez ces éléments dans votre fichier d'en-tête, vous pouvez les supprimer du ou des fichiers .c; les définitions de fonctions réelles, avec les corps, doivent être dans les fichiers .c - mais ne dupliquez pas les prototypes. Vous puis #include l'en-tête dans chaque fichier .c qui a besoin des fonctions, etc. déclaré en elle.

Vous devez également vous assurer que les éléments du fichier d'en-tête ne sont pas #include plus d'une fois dans chaque fichier source, même indirectement (inclus à partir d'un autre fichier inclus). Habituellement gardes d'en-tête sont utilisés pour cela, qui utilisent conditionals préprocesseur pour empêcher le traitement du fichier d'en-tête quand il a déjà été inclus:

#ifndef SOMEHEADER_H 
# define SOMEHEADER_H 

/* header file contents */ 

#endif 

Lors de la compilation, vous devriez être en mesure de compiler chaque fichier .c séparément si vous le souhaitez , ou tous ensemble si le compilateur vous le permet. Lors de la liaison, vous devez cependant lier tous les fichiers objets. Pour gcc, faire les deux en une seule commande, vous pouvez utiliser quelque chose comme ceci:

gcc -o program_name first.c second.c third.c 

... qui compile chaque fichier .c à son propre fichier .o, et relie tous ensemble lors de la production de l'exécutable.