Creo que ya veo más claramente la naturaleza de la situación. Pienso que lo que sucede es que, efectivamente, tu programa no está haciendo nada inválido, ni amerita
warning alguno, una vez se corrigen ciertos detalles.
En realidad, declarar variables en archivos de cabecera es perfectamente legal en ANSI C y, aunque suele ser considerado como un recurso poco elegante y evitado al máximo por mucho programadores, constituye un medio válido de solucionar un problema de programación. Es común en ciertas aplicaciones colocar declaraciones de variables globales en archivos de cabecera, los cuales serán incluidos desde varios archivos fuente.
Quizás tu confusión proviene de la sutil pero fundamental diferencia de una declaración y una definición. La definición es el lugar en donde una variable es creada (y se reserva el espacio de memoria necesario para almacenar los valores de la variable). La declaración es el lugar en donde la naturaleza (el tipo) de una variable se declara, pero no se reserva memoria aun. Las variables pueden ser declaradas varias veces, pero definidas sólo una.
He modificado un poco tu código, y de este modo verás que pasa la etapa de compilación de gcc sin warnings:
Código:
/* principal.c */
#include "prueba.h"
int
main (void)
{
prueba();
pruebb();
pruebc();
return 0;
}
/* fin principal.c */
/* pruebab.c */
#include "prueba.h"
void
pruebb (void)
{
printf ("\nDIGITE SU EDAD:");
scanf ("%s", edad);
}
/* fin pruebab.c */
/* prueba.c */
#include "prueba.h"
void
prueba (void)
{
printf ("\nDIGITE SU NOMBRE:");
scanf ("%s" ,nombre);
}
/* fin prueba.c */
/* pruebac.c */
#include "prueba.h"
void
pruebc (void)
{
printf ("\nNOMBRE\t\t\tEDAD\n");
printf ("%s\t\t\t%s", nombre, edad);
}
/* fin pruebac.c */
/* prueba.h */
#include <stdio.h>
void prueba (void);
void pruebb (void);
void pruebc (void);
char nombre[40], edad[3];
/* fin prueba.h */
Ahora bien, trata de agregar una definición en el archivo prueba.h, por ejemplo:
Código:
char no_valido[] = "Estoy definiendome...";
Lee la salida del proceso de compilarlo... ¿era eso lo que esperabas desde un comienzo?
Ahora, te diré que personalmente soy de las personas que tratan de evitar ese tipo de cosas al máximo. En realidad lo considero poco elegante, y usualmente cuando uno recurre a ese tipo de "trucos" en un programa, es porque en el fondo hay un problema más serio en el código (generalmente de diseño de los algoritmos u otras cosas de fondo). Creo que bajo ninguna circunstancia se justifica realmente el uso de variables globales; es buena idea evitarlas al máximo. Por supuesto, es sólo mi consejo personal.
Otra cosa, un poco fuera de tema... Me ha sorprendido un poco tu broma sobre tu código "patentado". En realidad cuando leo ese tipo de cosas, aun cuando sea en broma, me preocupa bastante. Te recomiendo enormemente que te informes más sobre el tema de las patentes y su relación con la creación de software. Te darás cuenta que las patentes en la industria del software hacen mucho más daño que otra cosa. Si no ha sido más que una broma y eres consciente del mal que constituyen las patentes, me alegra mucho. De otra forma, por favor considera estudiar un poco más sobre el tema, te harás un favor enorme a tí y a la gente (colegas programadores) que te rodee. Con mucho gusto yo podría colaborarte con el tema....
Que estés muy bien.