2010-01-10 6 views
3

J'essaie une variable globale pour tenir mon message d'erreur dans C.variable globale dans une autre bibliothèque, C

Une bibliothèque appelée Utils a:

#ifndef private_error_h 
#define private_error_h 

extern char error[1024]; 

__declspec(dllexport) void FillError(char* newError); 
#define GetErr() error 

#endif 

fichier error.c:

#include "private_error.h" 

char error[1024]; 
void FillError(char* newError) { 
    // ... 
} 

Ensuite, j'essaie de l'utiliser dans un programme:

#include "private_error.h" 

int main() { 
    FillError("General error"); 
    printf("%s\n", GetErr()); 
    return 0; 
} 

Il crée deux variables avec des adresses différentes. Comment puis-je faire en sorte que le programme utilise la variable de la bibliothèque Utils?

J'ai réussi à contourner ce problème en changeant GetErr à une fonction retournant la chaîne, mais je me demande toujours où se trouve l'erreur.

Répondre

3

Vous devez déclarer dans votre fichier d'en-tête comme

erreur extern char [];

et dans votre fichier de code (fichier .c), déclarer

erreur char [1024];

Vous allouez deux fois

+0

La seconde, sans extern, est une définition. –

+0

J'ai essayé cela et la bibliothèque ne peut pas reconnaître le tableau. error LNK2001: symbole externe non résolu _HError – Hagai

+0

Vous avez peut-être des problèmes particuliers avec votre fichier DLL, car vous indiquez dans votre question ce que vous ciblez. –

-1

Pourquoi ne pas utiliser la fonction comme ceci:

dans .h:

char* GetErr(); 

et Cpp:

char* GetErr() { return error; } 

Essayez d'éviter variables globales. Dans la portée du fichier c'est assez sûr, mais si vous essayez de l'utiliser à travers de nombreux fichiers, il peut causer de grosses erreurs.

+0

Quel est le problème avec un tableau global? Comment une fonction «get» empêchera-t-elle les «grosses erreurs» si de nombreux fichiers l'utilisent? Ils ont toujours accès au tableau. – Pod

+0

Ils ont s'ils déclarent explicitement l'utiliser. Vous évitez par exemple les erreurs de noms alors que 'error' est un nom plutôt populaire pour la variable: P Masquer l'implémentation est toujours une bonne pratique. – qba

+0

C'est ce que j'ai fait pour ne pas rester coincé. Mais j'aimerais quand même savoir comment définir un tableau global ... – Hagai