2010-06-23 5 views
9

Tengo un pequeño proyecto en el que puse nombre a dos funciones del mismo nombre en dos archivos fuente diferentes, pero mientras construía el proyecto, el compilador falló con 'func_name ya definido en filename.obj'.¿Cómo tratar el nombre de la función duplicada dentro de C?

¿Por qué no podría tener dos funciones con el mismo nombre en dos archivos de origen diferentes? Pensé que la función debería ser local para el archivo fuente solo si cuando lo declaramos en el archivo de cabecera se convierta en global.

Y a excepción de cambiar el nombre del archivo, ¿hay alguna otra solución elegante para el nombre de la función duplicada en el lenguaje de programación C?

+0

Es por eso que siempre uso nombres verdaderamente significativos para variables y funciones. Si esas dos funciones están haciendo exactamente lo mismo, entonces no necesita una de ellas. Si están haciendo cosas diferentes, dale a cada uno un nombre significativo que refleje lo que hace. Quien tenga que mantener tu código te lo agradecerá. Lo más probable es que seas tú. – Mawg

Respuesta

28

En C, una función tiene ámbito global por defecto. Para restringir su alcance, use la palabra clave static para hacerlo privado en un módulo.

El rol del archivo de encabezado es simplemente publicitar la función junto con su firma a otros módulos.

Todos los nombres globales deben ser (con algunas salvedades) únicos. Esto tiene sentido porque ese nombre es lo que usa el vinculador para conectar una llamada de función a la implementación de la función en sí misma.

Los nombres con alcance local y estático solo deben ser únicos dentro de su alcance.

+7

Consejo: marque cada función que pueda como 'estática'. También facilitará el optimizador del compilador, por ejemplo, elegir funciones en línea y similares. – u0b34a0f6ae

2

La solución elegante es el espacio de nombres introducido en C++. La solución, si hay pocas llamadas a func_name es tomar uno, renombrarlo y recompilarlo.

solución

Algo hackerous pero rápido podría ser la siguiente:

//In one of the two source files and any file that calls it 

//if your functions is something like this 
//void func_name(int) { ... } 
//Add the following line 
#define func_name SOME_UNIQUE_FUNC_NAME 
+4

Declarar estática es la mejor solución según lo sugerido por RBerteig. Dejo mi respuesta con la esperanza de que pueda ser útil de todos modos para alguien. – user347594

+0

fue útil con un problema similar al que estaba enfrentando. Gracias. – FilipeCanatto

4

Declare la función static para que sea local en el archivo. En C, cada nombre de identificador debe ser único.

5

Why could not I have two function with the same name in two differenct source file?

Becuase el enlazador tiene que saber lo que se quiere decir cuando hace referencia a ella.

Imagaien que a.h y b.h ambos deflazan my_function(). El compilador genera código para ambos. Ahora imagine que c.c llama al my_function(), ¿cómo sabe el vinculador cuál de las dos versiones de la función debería llamarse?

5

Si algo se declara en el archivo de encabezado o en el archivo de código fuente no supone ninguna diferencia para el compilador. De hecho, el compilador propiamente dicho no conoce absolutamente nada sobre ningún "archivo de cabecera", ya que los archivos de cabecera están incrustados en los archivos fuente por el llamado preprocesador, que hace su trabajo antes del compilador propiamente dicho. En el momento en que los archivos de origen (con archivos de encabezado incrustados) llegan al compilador real, no hay forma de saber qué había originalmente y qué se insertó de los archivos de encabezado. El archivo de origen con todos los archivos de encabezado incrustados se llama unidad de traducción. Es decir. el compilador funciona correctamente con unidades de traducción, no con algunos archivos "fuente" o "encabezado".

En lenguaje C todos los objetos y funciones declarados en el alcance del archivo tienen enlace externo de forma predeterminada, lo que significa que son globales, únicos para todo el programa. Entonces, pensaste incorrectamente. Las funciones no son locales para un solo archivo fuente.

Si desea convertir una función (o un objeto) local en una sola unidad de traducción, debe realizar algunos pasos explícitos. Debe declararlo como static. Declararlo como estático le dará el enlace interno , lo que significa esencialmente que se convierte en interno de su unidad de traducción.

Declarar sus funciones static solo funcionará si las dos realmente tienen que ser locales para sus propias unidades de traducción. Si este no es el caso, es decir, si al menos una de las funciones debe ser una función accesible globalmente (vinculable), entonces no tiene más remedio que renombrar una de las funciones.

Cuestiones relacionadas