Question

J'ai du mal à découvrir pourquoi je ne peux pas avoir la même fonction dans plusieurs fichiers source C. J'ai toujours pensé que je ne pouvais pas accéder aux fonctions dans un autre fichier source tant qu'elles ne sont pas déclarées dans un fichier d'en-tête.

Supposons que j'ai ce qui suit:

main.c -> comprend thread1.h & thread2.h

thread1.h -> déclare par exemple void * thread1 ();

thread1.c -> définit void * thread1 () {} et définit void Lock () {}

thread2.h -> déclare par exemple void * thread2 ();

Thread2.c -> définit void * thread2 () {} et définit void Lock () {}

Maintenant, GCC me dit que je ne peux pas faire ça!

gcc -pthread -wall -o exécutable main.c thread1.c thread2.c

Erreur: définition multiple de «verrouillage»

Donc ma question est maintenant:Comment puis-je accomplir ce que je veux?

Je ne pense pas que cela soit censé être impossible. Sinon, tout ce code source C disponible dans toutes les nombreuses bibliothèques C devrait être unique. (Non n'aurait aucun sens, ou ne le ferait-il?)

Je me suis donc dit il y a environ 3 heures qu'il devait y avoir une solution. Que je dois manquer quelque chose ici.

Eh bien, j'ai essayé de le googler ... mais d'une manière ou d'une autre, mes compétences Google ne m'ont pas aidé cette fois. N'y a-t-il vraiment aucun moyen de faire cela? Ou suis-je juste trop stupide pour le rechercher?

Merci d'avance,

leep

Était-ce utile?

La solution

Vous aurez besoin de cette fonction lock() être static.

static void lock() {..}

La raison en est que les fonctions avec static ne sont pas visibles en dehors de "l'unité de traduction". En d'autres (probablement) mots, les fonctions statiques sont privé au fichier * .c. Par conséquent, ils ne provoquent pas d'erreurs de liaison au stade de liaison, comme vous en avez actuellement.

Autres conseils

Vous devez déclarer le verrouillage comme static void lock(){}.

Sinon, le nom de la fonction sera visible partout dans le programme et vous obtiendrez une collision de nom (bien que vous ne puissiez toujours pas l'appeler sans prototype de fonction).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top