2017-08-24 2 views
2

Ich habe zwei Dateien, main.c und hash.ceine globale Struktur zwischen zwei Dateien Teilen (in C)

In hash.c ich eine leere Hash-Tabelle nur haben die hashtable und einige Funktionen aufgerufen (nicht die Haupt) und in main.c, habe ich die Funktion main() und die #include "hash.h"

Meine Frage ist, wenn in main.c, nenne ich eine Funktion aus der hash.c wie: fügt hash_add("strawberry", 3), die ein Schlüssel mit seinem Element in der Hash-Tabelle der hash.c (hashtable),

Dann wenn Ich mache extern hash * hashtable in der Main.c wird meine 3 Erdbeeren in Hashtable sein? Oder wird meine Hashtable leer sein?

(Was ich denke, ist, wenn ich hash_add("strawberry", 3) nennen, meine 3 Erdbeeren in hashtable sind, solange ich im Rahmen der Funktion bin)

Danke

+0

Wenn Sie 'Hash * hastable;' in hash.c, müssen Sie 'extern Hash schreiben * hashtable; 'in jeder anderen Datei, in der die Variable verwendet werden soll. – mch

Antwort

2

Es gibt zwei Möglichkeiten, dies zu tun in C. Es klingt, als ob Sie globale Variablen verwenden, also werde ich das zuerst beschreiben. Ein besserer Weg ist es, lokale Variablen zu verwenden, und ich werde Ihnen die zweite zeigen:

Mit globalen Variablen, die Sie so etwas tun würde:

// 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 
} 

Am besten ist es nicht globale Variablen zu verwenden, weil man sonst Bekommen Sie weniger Namenskonflikte und Sie können mehr als eine Hash-Tabelle gleichzeitig haben. In diesem Fall würden Sie normalerweise einen Zeiger auf einen Hash halten und dann den Hash-Funktionen gehen in:

// 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); 
} 
Verwandte Themen