[C con Clase] error en la utilización de extern

Davidson, Steven srd4121 en njit.edu
Jue Dic 5 19:08:31 CET 2013


Hola Ernesto,

2013/12/5 Ernesto Cajigal <ernestoac en icrt.cu>

>  Hola ante todo,
> Les escribo porque tengo un pequeño proyecto de Estructura de Datos 1 en
> C++, estoy programando en Borland C++ Builder 6.0 (nos obligan!!!!).
> El problema es el siguiente:
> Tengo básicamente 4 ficheros: UClass (que almacena las todas las clases
> diseñadas), UListas (la declaración e implementación de las listas
> enlazadas) , FMain (ficheros del formulario principal) y FInsertar (otro
> formulario). La verdad es que tengo más formularios pero el problema reside
> en que hago una declaración de la clase controladora TMITRANS (en el
> formulario principal FMain): *TMITRANS* scMitrans = new TMITRANS();*//aquí ok
>
> En proyectos anteriores en el otro formulario (FInsertar) para utilizar
> esta clase la incluía (#include "UClass.h") y escribía:
> *extern TMITRANS* scMitrans = new TMITRANS();* //en esta linea me da el
> error E2141 Declaration syntax error
> también probé, cosa que había hecho anteriormente poner solo *extern
> TMITRANS* scMitrans;*
>
>
Si has definido 'scMitrans' en un fichero fuente y quieres usar esa misma
variable global en otro fichero fuente, entonces con declarar 'scMitrans'
con 'extern' es suficiente. Esto es,

// FMain.cpp

TMITRANS *scMitrans = new TMITRANS;
...


// FInsertar.cpp

extern TMITRANS *scMitrans;
...


Creo que el problema que estás teniendo es que defines la variable global y
la declaras (externamente) en sus respectivos ficheros de cabecera. Es
posible que #incluyas uno o ambos ficheros de cabecera en diferentes
ficheros fuente, por lo que defines diferentes variables globales. En
general, deberías definir las variables globales en un fichero fuente, y
declararlas en los ficheros de cabecera. Por ejemplo, podrías hacer esto:

// FMain.cpp

TMITRANS *scMitrans = new TMITRANS;
...


// FInsertar.h

extern TMITRANS *scMitrans;
...


Recuerda que #include simplemente "vuelca" el contenido de los ficheros de
cabecera en otro fichero. Esto puede suponer que copias el mismo contenido
a cada fichero fuente. Si tal fichero de cabecera contiene definiciones de
variables, entonces cada fichero fuente, que lo incluya, tiene una copia
del contenido. Te pongo un ejemplo de un posible problema:

// defs.h
int g_var;


// fichero01.h
#include "defs.h"

// fichero01.cpp
#include "defs.h"
#include "fichero01.h"


Aquí tendremos un error porque estamos redefiniendo 'g_var'. Al final, el
compilador obtendrá este fichero fuente que contendrá esto:

int g_var;
int g_var;


Como puedes ver, simplemente se copia (o se vuelca) el contenido de cada
fichero de cabecera que en este caso implica definir la variable con el
mismo nombre. Lo que sí podemos hacer es hacer declaraciones; por ejemplo,

// defs.h
extern int g_var;


// fichero01.h
#include "defs.h"

// fichero01.cpp
#include "defs.h"
#include "fichero01.h"

Al final, el fichero fuente contendrá:

extern int g_var;
int g_var;

Tenemos una declaración (externa) y una sola definición (global).

En general, no aconsejo escribir definiciones de variables en los ficheros
de cabecera, sino en los ficheros fuente. Al fin y al cabo, no solemos
necesitar las variables en los ficheros de cabecera, sino en los ficheros
fuente.


Espero que esto te sirva.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20131205/baa3564b/attachment.html>


Más información sobre la lista de distribución Cconclase