Variables Extern

Iniciado por netca, 19 Julio 2012, 21:42 PM

0 Miembros y 1 Visitante están viendo este tema.

netca

Yo defino un Header ejemplo.h con la siguiente estructura:

....
typedef struct{
      int a;
      tipo b;

}nombre;

extern nombre Variable;

void funcion();
...

#endif


Luego en mi ejemplo.c :

#include "ejemplo.h"

...
nombre Variable;
....

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



En mi main.c debo poner:

#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!

fary

no, si pruebas te vas a dar cuenta.
Un byte a la izquierda.

BlackZeroX

#2
Cita de: netca en 19 Julio 2012, 21:42 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...



#include <stdio.h>

double variable = 0;

void funcX() {
   extern double variable; //  Hacemos referencia a la varible que esta afuera de este proceso... NO ES NECESARIO.
   variable = 50;          //  Cambiamos su valor.
}

int main() {
   printf("%f\n", variable); //  imprimimos la variable
   funcX();
   printf("%f\n", variable); //  imprimimos la variable
   return 0;
}



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

main.h


#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED

extern int x;   //  esta variable no esta declarada en ningun header pero si en algun archivo ".c" en este caso test.c
               //  si no se declara de esta manera dara un error de que no se a declarado dicha variable...
               
#endif // MAIN_H_INCLUDED



main.c


#include <stdio.h>

int x = 0;
extern int y;   //  esta variable no esta declarada en ningun header pero si en algun archivo ".c" en este caso test.c
               //  si no se declara de esta manera dara un error de que no se a declarado dicha variable...

extern void funcx();    //  Le decimos que es una

int main() {
   printf("x = %d\ny = %d\n", x, y);  //  imprimimos la variable
   funcx();            //  esta dentro del archivo text.h
   printf("x = %d\ny = %d\n", x, y);  //  imprimimos la variable
   y = 666;
   printf("x = %d\ny = %d\n", x, y);  //  imprimimos la variable
   return 0;
}



test.h



#ifndef TEST_H
#define TEST_H

#include "main.h"

void funcx();

#endif // TEST_H



test.c


#include "test.h"

int y = 0;

void funcx() {
   x = 100;
   y = 200;
}



o algo mas simplista pero no recomendado...

main.c


#include <stdio.h>

int x = 0;
extern int y;   //  esta variable no esta declarada en ningun header pero si en algun archivo ".c" en este caso test.c
               //  si no se declara de esta manera dara un error de que no se a declarado dicha variable...

extern void funcx();    //  Le decimos que es una

int main() {
   printf("x = %d\ny = %d\n", x, y);  //  imprimimos la variable
   funcx();            //  esta dentro del archivo text.h
   printf("x = %d\ny = %d\n", x, y);  //  imprimimos la variable
   y = 666;
   printf("x = %d\ny = %d\n", x, y);  //  imprimimos la variable
   return 0;
}



test.c


extern int x;
int y = 0;

void funcx() {
   x = 100;
   y = 200;
}




Dulces Lunas!¡.
The Dark Shadow is my passion.

netca

Muchas gracias BlackZeroX (Astaroth) por los ejemplos y por haber aclarado mi duda :)

x64core

usar #pragma once directive para hacer el trabajo más facil, esto es para productos MS.
Los externs deben estar en los .h

david_BS

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

char asd[128]="";


archivo2.cpp

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.

netca

Gracias a todos por responder.