Más flags: i mayúscula (include), wall, werror, pedantic...

Algunos otros flags de GCC que hasta ahora no hemos visto y que pueden ser muy útiles en el momento de desarrollar. En algunos entornos de desarrollo es posible activar opciones que se convierten en el uso de estos flags. Con el flag -I (I mayúscula) podremos incluir directorios de búsqueda. Con las opciones Wall, Werror y pedantic podemos aumentar el nivel de detalle de los mensajes de error.

Cuando trabajamos con C, entender cómo funcionan los archivos include es fundamental para organizar nuestro código y evitar problemas durante la compilación. En primer lugar, es importante distinguir entre dos formas de incluir archivos de cabecera: usando comillas dobles "archivo.h" o los símbolos de menor y mayor que <archivo.h>. La diferencia radica en dónde busca el compilador esos archivos.

Cuando usamos los símbolos < >, le indicamos al compilador que busque el archivo dentro de los directorios estándar del sistema. Por ejemplo, en sistemas Unix como Linux o macOS, estos directorios suelen ser /usr/include y /usr/local/include. Allí se encuentran las cabeceras de la biblioteca estándar de C, como stdio.h, stdlib.h o string.h, así como las cabeceras de otras librerías que hayamos instalado. El compilador tiene una lista interna con estas rutas y busca en ellas el archivo solicitado.

Por otro lado, cuando usamos comillas dobles, le decimos al compilador que incluya un archivo que está en una ruta específica, normalmente dentro de nuestro proyecto. Por ejemplo, si tenemos un archivo calculadora.h dentro de un directorio inc, lo incluiremos con "inc/calculadora.h". Esto le indica al compilador que busque exactamente en esa ubicación.

Sin embargo, en proyectos grandes es común agrupar todos los archivos de cabecera en un directorio común, como include o headers, y querer incluirlos usando los símbolos < > para mantener un estilo uniforme. Para que el compilador pueda encontrar estos archivos en rutas personalizadas, podemos indicarle directorios adicionales con la opción -I (i mayúscula) de GCC. Por ejemplo, si nuestro directorio de cabeceras es inc, compilaremos con gcc -Iinc ... y así el compilador buscará también en esa carpeta cuando usemos includes con < >.

Incluso podemos usar rutas absolutas con -I, como -I/home/usuario/proyecto/inc, o simplemente indicar el directorio actual con -I. para que el compilador busque en la carpeta donde estamos trabajando. Esto hace que, en la práctica, no haya mucha diferencia entre usar comillas o símbolos < > si configuramos bien las rutas de búsqueda.

Pasando a otro aspecto crucial, los archivos include no solo sirven para organizar el código, sino que también son esenciales para que el compilador conozca las declaraciones de funciones y tipos que usamos. Si omitimos un include, por ejemplo, no incluir stdio.h cuando usamos printf, el compilador nos mostrará un warning indicando que la función está declarada implícitamente. Esto significa que no sabe qué parámetros acepta ni qué devuelve, lo que puede provocar comportamientos inesperados.

Aunque GCC permite compilar y generar un ejecutable incluso con estas advertencias, este comportamiento es heredado de versiones antiguas de C y no es recomendable. Para evitar que el compilador ignore estos avisos, podemos usar la opción -Werror, que convierte todos los warnings en errores y detiene la compilación si aparecen. Así nos aseguramos de corregir cualquier problema antes de generar el programa.

Además, para mejorar la calidad del código, es muy útil activar la opción -Wall, que muestra todas las advertencias posibles, y -pedantic, que hace que el compilador sea más estricto y nos avise de cualquier desviación del estándar. Por ejemplo, si declaramos una variable y no la usamos, con estas opciones el compilador nos lo indicará, ayudándonos a detectar posibles errores o código innecesario.

En resumen, configurar correctamente los includes y las opciones de compilación nos permite escribir código más limpio, evitar errores difíciles de detectar y mantener un proyecto organizado, especialmente cuando crece en tamaño y complejidad.

Lista de reproducción
  1. 1
    Instalar CodeBlocks
    15 minutos
  2. 2
    Funciones y hola mundo
    17 minutos
  3. 3
    Variables y tipos de datos
    17 minutos
  4. 4
    Condicionales y operadores lógicos
    16 minutos
  5. 5
    Bucles
    11 minutos
  6. 6
    Punteros
    12 minutos
  7. 7
    Arrays
    14 minutos
  8. 8
    Estructuras
    12 minutos
  9. 9
    Otras construcciones de C
    9 minutos
  10. 10
    Memoria dinámica
    8 minutos
  11. 11
    El preprocesador (parte 1)
    10 minutos
  12. 12
    El preprocesador (parte 2)
    9 minutos
  13. 13
    Archivos de cabecera y múltiples .c (parte 1)
    8 minutos
  14. 14
    Archivos de cabecera y múltiples .c (parte 2)
    9 minutos
  15. 15
    C desde la línea de comandos (parte 1)
    8 minutos
  16. 16
    C desde la línea de comandos (parte 2)
    9 minutos
  17. 17
    Break y continue
    10 minutos
  18. 18
    Goto
    13 minutos
  19. 19
    Manipulación de bits
    15 minutos
  20. 20
    Máscaras de bit
    19 minutos
  21. 21
    Archivos (1): fopen y fclose
    13 minutos
  22. 22
    Archivos (2): leer con fgetc
    9 minutos
  23. 23
    Archivos (3): fseek y ftell
    11 minutos
  24. 24
    Archivos (4): leer con fgets
    9 minutos
  25. 25
    Archivos (5): fputc y fputs
    7 minutos
  26. 26
    Archivos (6): volcar en archivos con fwrite
    10 minutos
  27. 27
    Archivos (7): fread, fwrite y los arrays
    10 minutos
  28. 28
    Archivos (8): entrada estándar y salida estándar
    9 minutos
  29. 29
    Archivos (9): buffers
    14 minutos
  30. 30
    Archivos (y 10): otras funciones útiles con archivos
    5 minutos
  31. 31
    printf (1)
    18 minutos
  32. 32
    printf (parte 2)
    12 minutos
  33. 33
    scanf (parte 1)
    17 minutos
  34. 34
    scanf (parte 2)
    17 minutos
  35. 35
    fprintf, sprintf y snprintf
    8 minutos
  36. 36
    Tipos de datos opacos
    13 minutos
  37. 37
    Bibliotecas estáticas
    13 minutos
  38. 38
    Bibliotecas dinámicas
    15 minutos
  39. 39
    Más flags: i mayúscula (include), wall, werror, pedantic...
    12 minutos
  40. 40
    pkg-config
    12 minutos
  41. 41
    Make
    17 minutos
  42. 42
    GDB
    21 minutos
  43. 43
    Variables globales
    6 minutos
  44. 44
    extern
    9 minutos
  45. 45
    Funciones variádicas
    12 minutos
  46. 46
    El optimizador de GCC y la opción -O
    12 minutos
  47. 47
    Volatile
    6 minutos