# Estructura Básica del Programa C
| Sección | Descripción |
| ------------------ | ------------ |
| Documentación | Suele ir al comienzo, aunque no en todos los códigos fuente se hace por malas prácticas. Pero debería describir qué es lo que hace ese código fuente e incluso tener información del programador, fecha de creación, etc. Esto se escribe en forma de comentarios. En el ejemplo anterior de código en C sería lo correspondiente a `/* Programa Hola Mundo */ |
| Enlace | En esta parte, que viene justo tras la documentación, se incluyen los archivos de cabecera o bibliotecas que se necesitan para el código fuente que se está escribiendo. De esta forma, cuando se compila o interpreta, se sabe que hay que agregar una copia de los archivos de encabezado también para que funcione el programa final. Dicho de otro modo, se han usado funciones que están descritas en esos archivos. Por tanto, para que se puedan ejecutar adecuadamente se necesita el código correspondiente. Es como usar bloques de construcción prefabricados, facilitando la labor del programador para que no tenga que escribir desde cero un código. Por ejemplo, `printf` es una función que imprime texto en pantalla, pero `printf` a su vez está definida y escrita con un código fuente que está presente en `stdio.h`, en este caso. Por eso verás la línea:
`#include` |
| Definición | En algunos casos, no en todos, se necesita también una directiva de preprocesador, que contiene constantes simbólicas. Por ejemplo: `#define` nos permite usar constantes en nuestro código. Reemplaza todas las constantes con su valor en el código. En el caso del ejemplo de Hola Mundo no es necesario y no está presente, pero en otros códigos sí que suele estar. Por ejemplo:
`#define EDAD 8`
`#define PI 3.1415`
En este caso, cada vez que el programador use `EDAD` a lo largo del código se interpretará como la constante con valor 8. En el segundo caso se define el valor constante del número PI. |
| Declaración global | Incluye declaración de variables globales, declaraciones de funciones, variables globales estáticas y funciones. Esto tampoco está presente en el ejemplo de Hola Mundo, pero que también puede aparecer en otros casos. Por ejemplo:
`#include `
`int x = 5; // Variable global`
`int main() {`
` int y = 10; // Variable local`
` return 0;`
`}`
Como puedes ver, `x` se define como una variable global, concretamente con el valor entero 5 en este caso. |
| Función principal | Para cada programa en C, la ejecución comienza desde la función `main()`. Es obligatorio incluir una función `main()` en cada programa C. A veces la puedes ver como `int main()` o incluso como `void main()`, etc.
Esta función principal es como cualquier otra función, también toma argumentos y devuelve un valor. Indicará que ahí es donde el programa comienza a ejecutarse. Y cuando se devuelve algún valor de `main()`, se entregará al sistema operativo.
`void main()` indica que la función `main()` no devolverá ningún valor, pero `int main()` indica que `main()` puede devolver datos de tipo entero. Cuando nuestro programa es simple y no va a terminar antes de llegar a la última línea del código, o el código está libre de errores, entonces podemos usar `void main()`. Pero si queremos terminar el programa usando el método `exit()`, entonces tenemos que devolver algunos valores enteros (cero o distinto de cero). En esa situación, `void main()` no funcionará. Por lo tanto, es una buena práctica usar `int main()`.
También habrás visto en algunos casos cosas como `int main(int argc, char **argv)` o similares. En este caso se agregan argumentos dentro de los paréntesis para pasarlos al momento de ejecución. Es decir, los argumentos que se usarán en la línea de comandos al ejecutar el programa, como los que usas con los comandos habituales. Por ejemplo:
`#include main(argc, argv)`
`int argc;`
`char *argv[];`
`{`
` if(argc!=2) { printf("Ha olvidado su nombre.\n");`
` exit(1);`
`}`
`printf("Hola %s", argv[1]);`
`}`
Al compilar este código fuente y al ejecutarlo, lo que hará es devolver "Hola" seguido del nombre que uses tras el comando. Si lo compilamos como "name", en la CLI podemos usar el comando:
`name Pepito`
Y el resultado será que no devuelve el mensaje:
`Hola Pepito`
Al haberle pasado ese argumento... |
| Subprogramas | Incluye todas las funciones definidas por el usuario. Puedes observar multitud de funciones muy diversas, según el propósito del programa. Y pueden estar desordenadas, sin seguir el orden lógico de ejecución. Además, nos podemos encontrar con uno o más bloques, cada uno con un propósito determinado.
Todo esto es opcional, ya que la única función obligatoria es `main()` en todo caso, que es la que indicará por dónde comenzar. |