2014-05-24 3 views
0

d'abord, je tiens à dire que je parle très peu anglais, alors excusez mes fautes d'orthographe.échouer y compris les bibliothèques en C

J'ai un problème de compilation des bibliothèques en C en utilisant le code: blocs comme IDE

Je le code suivant:

//main.c 

#include "lib1.h" 

int main(){ 

} 

Et le "lib1.h" est

#ifndef GUARD_LIB1 
#define GUARD_LIB1 

MyTypedef variable123; 

#endif 

le "lib1.c" est

#include "lib2.h" 
#include "lib1.h" 

enfin, "lib2.h" est

#ifndef GUARD_LIB2 
#define GUARD_LIB2 

typedef int MyTypedef; 

#endif 

Mais me donne toujours l'erreur de compilation, ne reconnaît pas MyTypedef dans "lib1.h", des suggestions?

L'erreur est:

"Unknow type name: 'MyTypedef'" 

EIDT:

Le code réel que j'ai le problème.

// EnzoLib.c 
#include <winsock2.h> 
#include <windows.h> 
#include <stdio.h> 
#include "EnzoLib.h" 




// EnzoLib.h 

//blah blah blah... 

//Estructuras 
typedef struct { 
    SOCKET sock; 
    char nombre[64]; 
    char activo; 
    struct sockaddr_in from; 
} Socket; 

//blah blah blah... 

et main.c

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <process.h> 
#include "EnzoLib.h" 

et l'erreur:

C:\Users\Enzo\Documents\codeblocks\lp1\ServidorChat\EnzoLib.h|6|error: unknown type name 'SOCKET'| 

dois-je ajouter #include avant #include "EnzoLib.h" dans main.c? Je ne l'aide des fonctions que je déclarai dans EnzoLib.h

EDIT2:

Est-ce que je suis en train de programmer une belle façon. Ne pas mettre le "#includes" toujours sur ".C fichiers"?

+1

Le compilateur ne peut pas déclarer une variable de type 'MyTypedef' sans voir d'abord la définition de ce type. Mettez le 'typedef' dans le fichier d'en-tête aussi. –

+0

'typedef struct int MyTypedef;'? Essayer de définir un type appelé 'struct int' est susceptible d'être une entreprise courageuse mais de courte durée. –

Répondre

1

Lors de la compilation main.c, l'en-tête lib2.h, qui contient la définition de MyTypedef, n'est jamais inclus. Par conséquent, lors de la compilation main.c, le compilateur a aucune idée ce que ce type est.

qui est, après l'exécution de préprocesseur, le compilateur voit deux « unités de traduction » (les appels fichier standard AC et tous les en-têtes, il comprend collectivement une unité de traduction):

main.c devient:

//main.c 

#ifndef GUARD_LIB1 
#define GUARD_LIB1 

MyTypedef variable123; 

#endif 

int main(){ 

} 

et lib1.c devient:

#ifndef GUARD_LIB2 
#define GUARD_LIB2 

typedef struct int MyTypedef; 

#endif 
#ifndef GUARD_LIB1 
#define GUARD_LIB1 

MyTypedef variable123; 

#endif 

En lib1.c le compilateur sait ce que MyTypedef est, mais dans main.c ce n'est pas le cas.

Si vous souhaitez utiliser un type dans un en-tête, l'en-tête doit inclure ses dépendances.Avez lib1.h inclure lib2.h, de sorte que toute personne qui utilise lib1.h peut dire ce que MyTypedef est.

0

Déplacer les fichiers inclus dans le EnzoLib.c à EnzoLib.h et ne garder que #include "EnzoLib.h"

Le contenu du EnzoLib.h devrait être quelque chose comme

#ifndef ENZOLIB_H 
#define ENZOLIB_H 

#include <winsock2.h> 
#include <windows.h> 
#include <stdio.h> 

typedef struct { 
    SOCKET sock; 
    char nombre[64]; 
    char activo; 
    struct sockaddr_in from; 
} Socket; 

#endif 
//end of EnzoLib.h 

Le contenu d'EnzoLib.c doit être en ligne

#include "EnzoLib.h" 

//Freely use the Socket structure 
Socket mySocket; 

//end of EnzoLib.c 
Questions connexes