2017-08-24 2 views
2

J'ai deux fichiers, main.c et hash.cPartager une structure globale entre deux fichiers (en C)

En hash.c, je n'ai une table de hachage vide qui est appelé hashtable et certaines fonctions (pas le principal) et main.c, j'ai la fonction principale() et le #include "hash.h"

Ma question est, si main.c, j'appelle une fonction de la hash.c comme: hash_add("strawberry", 3), qui ajoute une clé avec son élément dans la table de hachage du hash.c (qui est appelé hashtable),

Ensuite, si Je fais extern hash * hashtable dans le main.c mes 3 fraises seront-elles en hashtable? Ou ma hashtable sera-t-elle vide?

(Ce que je pense est quand je l'appelle hash_add("strawberry", 3), mes 3 fraises sont Hashtable aussi longtemps que je suis dans le cadre de la fonction)

Merci

+0

Si vous avez 'hachage * hastable,' en hash.c, vous devez écrire 'hachage extern * hashtable; 'dans tous les autres fichiers que vous voulez utiliser la variable. – mch

Répondre

2

Il y a deux façons de le faire en C. Il semble que vous utilisiez des variables globales, donc je vais décrire cela en premier. Une meilleure façon est d'utiliser des variables locales et je vais vous montrer que le deuxième:

Avec les variables globales que vous feriez quelque chose comme ceci:

// hash.h 
void hash_add(const char* key, int value); 
extern hash h; 

// hash.c 
hash h; 
void hash_add(const char* key, int value) { ... } 

// main.c 
#include "hash.h" 
int main() 
{ 
    hash_add("strawberry", 3); 
    // h will now have three strawberries 
} 

Il est préférable de ne pas utiliser des variables globales parce que vous allez Obtenez moins de conflits de noms et vous pouvez avoir plus d'une table de hachage à la fois. Dans ce cas, vous auriez normalement tenir un pointeur sur une table de hachage et passe ensuite dans les fonctions de hachage:

// hash.h 
void hash_add(hash* h, const char* key, int value); 
hash* hash_create(); 
void hash_destroy(hash* h); 

// main.c 
#include "hash.h" 
int main() 
{ 
    hash* h = hash_create(); 

    hash_add(h, "strawberry", 3); 
    // h will now have three strawberries 

    hash_destroy(h); 
}