Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: netca en 19 Julio 2012, 21:42 pm



Título: Variables Extern
Publicado por: netca en 19 Julio 2012, 21:42 pm
Yo defino un Header ejemplo.h con la siguiente estructura:

Código:
....
typedef struct{
      int a;
      tipo b;

}nombre;

extern nombre Variable;

void funcion();
...

#endif

Luego en mi ejemplo.c :
Código:
#include "ejemplo.h"

...
nombre Variable;
....

void funcion(){
   Variable->a = 1;
}


En mi main.c debo poner:

Código:
#include "ejemplo.h"

int main(){
     funcion();
     
}

Si luego de llamar a funcion en mi main.c quisiera acceder a Variable->a desde main tengo que definir algo en main.c ademas del include?
Saludos!


Título: Re: Variables Extern
Publicado por: fary en 19 Julio 2012, 21:58 pm
no, si pruebas te vas a dar cuenta.


Título: Re: Variables Extern
Publicado por: BlackZeroX en 19 Julio 2012, 22:38 pm
Si luego de llamar a funcion en mi main.c quisiera acceder a Variable->a desde main tengo que definir algo en main.c ademas del include?

En teoría deberías poner extern nombre Variable; pero ya lo has hecho en el header que incluyes, asi que no tienes que hacer nada mas...

--->

Te dejo algunos ejemplos...

Código
  1.  
  2. #include <stdio.h>
  3.  
  4. double variable = 0;
  5.  
  6. void funcX() {
  7.    extern double variable; //  Hacemos referencia a la varible que esta afuera de este proceso... NO ES NECESARIO.
  8.    variable = 50;          //  Cambiamos su valor.
  9. }
  10.  
  11. int main() {
  12.    printf("%f\n", variable); //  imprimimos la variable
  13.    funcX();
  14.    printf("%f\n", variable); //  imprimimos la variable
  15.    return 0;
  16. }
  17.  
  18.  

La teoría se puede aplicar de la misma manera en varios archivos por ejemplo.

main.h
Código
  1.  
  2. #ifndef MAIN_H_INCLUDED
  3. #define MAIN_H_INCLUDED
  4.  
  5. extern int x;   //  esta variable no esta declarada en ningun header pero si en algun archivo ".c" en este caso test.c
  6.                //  si no se declara de esta manera dara un error de que no se a declarado dicha variable...
  7.  
  8. #endif // MAIN_H_INCLUDED
  9.  
  10.  

main.c
Código
  1.  
  2. #include <stdio.h>
  3.  
  4. int x = 0;
  5. extern int y;   //  esta variable no esta declarada en ningun header pero si en algun archivo ".c" en este caso test.c
  6.                //  si no se declara de esta manera dara un error de que no se a declarado dicha variable...
  7.  
  8. extern void funcx();    //  Le decimos que es una
  9.  
  10. int main() {
  11.    printf("x = %d\ny = %d\n", x, y);  //  imprimimos la variable
  12.    funcx();            //  esta dentro del archivo text.h
  13.    printf("x = %d\ny = %d\n", x, y);  //  imprimimos la variable
  14.    y = 666;
  15.    printf("x = %d\ny = %d\n", x, y);  //  imprimimos la variable
  16.    return 0;
  17. }
  18.  
  19.  

test.h
Código
  1.  
  2.  
  3. #ifndef TEST_H
  4. #define TEST_H
  5.  
  6. #include "main.h"
  7.  
  8. void funcx();
  9.  
  10. #endif // TEST_H
  11.  
  12.  

test.c
Código
  1.  
  2. #include "test.h"
  3.  
  4. int y = 0;
  5.  
  6. void funcx() {
  7.    x = 100;
  8.    y = 200;
  9. }
  10.  
  11.  

o algo mas simplista pero no recomendado...

main.c
Código
  1.  
  2. #include <stdio.h>
  3.  
  4. int x = 0;
  5. extern int y;   //  esta variable no esta declarada en ningun header pero si en algun archivo ".c" en este caso test.c
  6.                //  si no se declara de esta manera dara un error de que no se a declarado dicha variable...
  7.  
  8. extern void funcx();    //  Le decimos que es una
  9.  
  10. int main() {
  11.    printf("x = %d\ny = %d\n", x, y);  //  imprimimos la variable
  12.    funcx();            //  esta dentro del archivo text.h
  13.    printf("x = %d\ny = %d\n", x, y);  //  imprimimos la variable
  14.    y = 666;
  15.    printf("x = %d\ny = %d\n", x, y);  //  imprimimos la variable
  16.    return 0;
  17. }
  18.  
  19.  

test.c
Código
  1.  
  2. extern int x;
  3. int y = 0;
  4.  
  5. void funcx() {
  6.    x = 100;
  7.    y = 200;
  8. }
  9.  
  10.  
  11.  

Dulces Lunas!¡.


Título: Re: Variables Extern
Publicado por: netca en 20 Julio 2012, 01:54 am
Muchas gracias BlackZeroX (Astaroth) por los ejemplos y por haber aclarado mi duda :)


Título: Re: Variables Extern
Publicado por: x64core en 20 Julio 2012, 06:56 am
usar #pragma once directive para hacer el trabajo más facil, esto es para productos MS.
Los externs deben estar en los .h


Título: Re: Variables Extern
Publicado por: david_BS en 25 Julio 2012, 01:24 am
si no estamos hablando de ser fino a la hora de programar, te diría que los externs pueden ir ya sea en archivos de fuente o archivos de cabecera, ya que funciona lo mismo. se trata de usar extern por ejemplo para variables globales que están en un archivo fuente y las necesitas en otro.

archivo1.cpp

Código:
char asd[128]="";


archivo2.cpp

Código:
extern asd[128];


nótese la diferencia entre la declaración que al mismo tiempo hace asignación, y en la referencia extern en la cual no se pone la asignación obviamente.


Título: Re: Variables Extern
Publicado por: netca en 25 Julio 2012, 01:57 am
Gracias a todos por responder.