2012-02-09 14 views
10

Tengo clase que declara un método pero no lo implementa. El método no es una función virtual. En el archivo cpp correspondiente no encontré la definición del mismo método. Todos los demás métodos declarados en la clase fueron definidos.Método declarado en Clase pero no definido

Recopilé el código y me fue bien. Tenía la impresión de que cpp debe ordenar la definición de un método declarado.

Apreciar si alguien puede dar más detalles sobre el mismo. Estoy usando el compilador cl de VS2010.

Respuesta

10

Su código se compilará pero dará errores de enlace.

La construcción de un ejecutable de su proyecto implica dos etapas:

  • compilación
  • Vinculación

Durante Compilación el compilador simplemente traduce el código fuente en código objeto mediante la verificación de la semántica del lenguaje .
Durante Enlazando el enlazador en realidad busca las definiciones de los símbolos y crea un archivo ejecutable a partir de varios archivos de objetos (creados durante la compilación).

El compilador compila el código fuente en cada unidad de traducción (.cpp + archivos de encabezado) por separado y, por lo tanto, asume que la definición debe estar presente en algún otro archivo fuente. Es el Enlazador el que trata de encontrar referencias a las definiciones de función, y por lo tanto, la definición faltante será informada por el vinculador.

Tenga en cuenta que el enlazador tiene que vincular sólo aquellos símbolos que son utiliza por su programa,
Por ejemplo, si su programa declara una función, no definidos & después nunca usos/llamadas la función en cualquier lugar, el vinculador no necesita insertar el código para saltar a la dirección donde reside el código objeto para la función en cualquier sitio de llamada de función.
Dado este escenario, el vinculador simplemente nunca tendrá que buscar la definición de la función en absoluto. Por lo tanto, el código compilará y vinculará.

+5

EN MIEMBRO, El error de enlace ocurrirá solo si la función con missing-definition se usa/llama explícitamente/implícitamente en alguna parte. – fizzbuzz

+0

@fizzbuzz: Sí, por supuesto. Ese es el criterio básico. –

+0

No recibo ningún error de compilación o enlace. Solo para agregar, no estoy usando la función en ningún lado. El código compila y enlaza bien en el archivo .lib. – akrohit

3

No es necesario que el método se implemente en un archivo en particular. De hecho, se considera (o se consideró) una buena práctica de programación tener un archivo por método para reducir la hinchazón cuando se vincula con las bibliotecas.

Esto significa que, dado un archivo de cabecera que define una clase (y presumiblemente no tiene la implementación en ella), el compilador solo puede suponer que todas las funciones se implementan en alguna parte. Solo cuando el sistema intenta unir todo (la etapa de enlace) resulta evidente que se está refiriendo a algo que no está allí.

+0

Un archivo ** por ** método? Parece excesivo ... –

+0

realmente no. hace mucho menos hinchazón y problemas de enlace sorprendentes. Algunos compiladores modernos lo hacen innecesario haciendo que cada función viva en una sección de objetos separada, pero la mayoría no lo hace. –

+0

Comprobé dos veces y no pude encontrar la definición del método del que estoy hablando anteriormente en ningún otro archivo. – akrohit

3

Es una técnica común para evitar la asignación o copia. Si lo declara pero no lo define, se producirá un error de vinculación si intenta usarlo, es decir, evita que las personas lo usen inadvertidamente

0

El compilador no se queja porque no hay ningún error de sintaxis/compilación. El vinculador no se queja porque no está llamando a la función en su programa por lo que no necesita vincularse.

Cuestiones relacionadas