Frage

Es fällt mir schwer herauszufinden, warum ich in mehreren C -Quelldateien nicht die gleiche Funktion haben kann. Ich dachte immer, dass ich in einer anderen Quelldatei nicht auf Funktionen zugreifen kann, solange sie nicht in einer Header -Datei deklariert sind.

Nehmen wir an, ich habe Folgendes:

main.c -> enthält thread1.h & thread2.h

thread1.h -> deklariert z. B. void * thread1 ();

thread1.c -> definiert void * thread1 () {} und definiert void lock () {}

thread2.h -> deklariert z. B. void * thread2 ();

thread2.c -> definiert void * thread2 () {} und definiert void lock () {}

Jetzt sagt GCC mir, dass ich das nicht tun kann!

gcc -pthread -wall -o ausführbar main.c thread1.c thread2.c

Fehler: Multiple Definition von "Lock"

Meine Frage ist also jetzt:Wie kann ich erreichen, was ich will?

Ich glaube nicht, dass dies unmöglich sein soll. Andernfalls müsste der gesamte C -Quellcode in allen vielen C -Bibliotheken eindeutig sein. (nah würde keinen Sinn ergeben oder würde es?)

Also dachte ich mir vor ungefähr drei Jahren, dass es eine Lösung geben muss. Dass ich hier etwas fehlen muss.

Nun, ich habe versucht, es zu googeln ... aber irgendwie haben mir diesmal nicht geholfen, dass meine Google -Fähigkeiten nicht geholfen haben. Gibt es wirklich keine Möglichkeit, dies zu tun? Oder bin ich nur dumm, danach zu suchen?

Danke im Voraus,

Leep

War es hilfreich?

Lösung

Sie benötigen diese Funktion lock() sein static.

static void lock() {..}

Der Grund ist, dass funktioniert mit static sind außerhalb der "Übersetzungseinheit" nicht sichtbar. In anderen (wahrscheinlich falschen) Worten sind die statischen Funktionen Privatgelände zur *.c -Datei. Daher verursachen sie keine Verknüpfungsfehler in der Verknüpfungsphase, wie Sie es derzeit haben.

Andere Tipps

Sie müssen Lock als deklarieren als static void lock(){}.

Andernfalls ist der Funktionsname im gesamten Programm sichtbar und Sie erhalten einen Namenskollision (obwohl Sie es ohne einen Funktionsprototyp immer noch nicht aufrufen können).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top