2009-04-02 13 views

Respuesta

27

es necesario limitar cada archivo se incluya solamente una vez. Puedes hacer esto de 2 maneras.

1) En la parte superior de los archivos de cabecera poner:

#pragma once 

o 2) si su compilador no admite eso, poner en la parte superior/final de sus archivos de cabecera:

#ifndef _MYFILE_H_ 
#define _MYFILE_H_ 
... 
#endif 

Reemplace MYFILE con el nombre de su archivo y reemplace ... con el contenido del archivo de encabezado.

+1

Creo que #pragma sólo funciona en VC++, no en gcc . El truco #define es portable. – Gorpik

+0

que generó gcc y vC++ –

+0

Wikipedia dice que #pragma una vez es compatible con VC++ y gcc http://en.wikipedia.org/wiki/Pragma_once. –

10

El error significa que hay un símbolo que se ha definido en un lugar y una definición alternativa se ha realizado en otro lugar.

Esto puede ocurrir si en casos como:

  • si define dos funciones con el mismo nombre
  • si hay una discrepancia entre una función y de prototipo
  • se llama a un no trivial función antes de que se haya definido, y sin un prototipo

En este último caso habrá una falta de coincidencia entre la función real y la "declaración implícita" que el compilador asume s cuando no tiene un prototipo para usar.

Estas situaciones pueden evitarse por:

  • garantía de que los prototipos de las funciones solamente se declaran vez
  • Asegurar que todas las funciones tienen nombres únicos dentro de su ámbito de aplicación (es decir, dentro de un archivo si son static, o. único si se usan entre archivos de objeto)
  • Tenga cuidado si usa extern declaraciones en archivos fuente para declarar prototipos. Es mejor usar un prototipo del archivo de encabezado apropiado.
  • Asegúrese de que todas las funciones tengan prototipos, ya sea dentro del archivo fuente en el caso de las funciones static, o en un archivo de encabezado si van a ser utilizados por otros archivos de objetos.
  • Asegúrese de que todos los archivos de cabecera sólo pueden incluirse una vez para cada archivo de origen, mediante uno de los constructos sugeridas por Mehrdad y Brian R. Bondy
Cuestiones relacionadas