Pregunta

Estoy teniendo dificultades para descubrir por qué no puedo tener la misma función en varios archivos de origen C. Siempre pensé que no puedo acceder a las funciones en otro archivo fuente siempre que no sean declarados en un archivo de encabezado.

Supongamos que tengo lo siguiente:

Main.c -> incluye Thread1.h y Thread2.h

Thread1.h -> declara Eg void * Thread1 ();

thread1.c -> define void * thread1 () {} y define void bloqueo () {}

Thread2.h -> declara Eg Void * Thread2 ();

thread2.c -> define void * thread2 () {} y define void bloqueo () {}

¡Ahora GCC me dice que no puedo hacer eso!

GCC -PTHREAD -WALL -O Ejecutable Main.C Thread1.C Thread2.C

Error: definición múltiple de 'bloqueo'

Entonces mi pregunta ahora es:¿Cómo puedo lograr lo que quiero?

No creo que esto sea imposible. De lo contrario, todo ese código fuente C disponible en todas las bibliotecas C necesitaría ser único. (nah no tendría sentido, ¿o lo haría?)

Así que pensé para mí mismo hace unos 3H que debe haber una solución. Que me falta algo aquí.

Bueno, intenté buscarlo en Google ... pero de alguna manera mis habilidades de Google no me ayudaron esta vez. ¿Realmente no hay forma de hacer esto? ¿O soy solo estúpido para buscarlo?

Gracias por adelantado,

leep

¿Fue útil?

Solución

Necesitarás esa función lock() ser - estar static.

static void lock() {..}

La razón es que funciona con static no son visibles fuera de la "unidad de traducción". En otras palabras (probablemente incorrectas), las funciones estáticas son privado al archivo *.c. Por lo tanto, no causan errores de vinculación en la etapa de vinculación, como lo tienes actualmente.

Otros consejos

Debes declarar el bloqueo como static void lock(){}.

De lo contrario, el nombre de la función será visible en todo el programa y obtendrá una colisión de nombres (aunque aún no podrá llamarlo sin un prototipo de función).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top