GCC opciones · 6 min read · Jan 22, 2026

Opciones de línea de comandos de GCC poco comunes pero útiles - parte 2

El compilador gcc ofrece una lista aparentemente interminable de opciones de línea de comandos. Por supuesto, nadie usa o tiene experiencia en todas ellas, pero hay un grupo selecto que cada usuario de gcc debería - si no debe - conocer. Mientras que algunas de ellas son comúnmente utilizadas, otras son un poco inusuales pero no menos útiles.

En esta serie de artículos, nos estamos enfocando en algunas de esas opciones de línea de comandos de gcc poco comunes pero útiles, y ya hemos cubierto un par de ellas en la parte 1.

Si recuerdas, al principio de la primera parte de esta serie de tutoriales, mencioné brevemente que la opción -Wall que los desarrolladores generalmente utilizan para generar advertencias no cubre algunas advertencias específicas. Si no eres consciente de estas advertencias y no tienes idea de cómo habilitarlas, no te preocupes, ya que explicaremos todo eso en detalle en este artículo.

Aparte de esto, también cubriremos una opción de advertencia de gcc relacionada con variables de punto flotante, así como cómo gestionar mejor las opciones de línea de comandos de gcc si la lista crece.

Pero antes de avanzar, ten en cuenta que todos los ejemplos, comandos e instrucciones mencionados en este tutorial han sido probados en Ubuntu 16.04 LTS, y la versión de gcc que hemos utilizado es 5.4.0.

** Habilitar advertencias que no están cubiertas por -Wall

Mientras que la opción -Wall del compilador gcc cubre la mayoría de las banderas de advertencia, hay algunas que permanecen deshabilitadas. Para habilitarlas, usa la opción -Wextra.

Por ejemplo, echa un vistazo al siguiente código:

#include   
#include   
int main()  
{  
    int i=0;  
    /* ...  
       algún código aquí   
       ...  
    */  
      
    if(i);  
        return 1;  
     return 0;   
}

Accidentalmente puse un punto y coma después de la condición ‘if’. Ahora, cuando el código fue compilado usando el siguiente comando gcc, no se produjo ninguna advertencia.

gcc -Wall test.c -o test

Pero cuando se usó la opción -Wextra:

gcc -Wall -Wextra test.c -o test

Se produjo una advertencia:

test.c: En la función ‘main’:  
test.c:10:8: advertencia: sugiere llaves alrededor del cuerpo vacío en una declaración ‘if’ [-Wempty-body]  
 if(i);

Como se puede ver en la advertencia mostrada arriba, la opción -Wextra habilitó internamente la bandera -Wempty-body, que a su vez detectó el código sospechoso y emitió la advertencia. Aquí está la lista completa de banderas de advertencia habilitadas por esta opción:

-Wclobbered, -Wempty-body, -Wignored-qualifiers, -Wmissing-field-initializers, -Wmissing-parameter-type (solo C), -Wold-style-declaration (solo C), -Woverride-init, -Wsign-compare, -Wtype-limits, -Wuninitialized, -Wunused-parameter (solo con -Wunused o -Wall), y -Wunused-but-set-parameter (solo con -Wunused o -Wall).

Si quieres aprender qué hacen las banderas mencionadas anteriormente, dirígete a la página del manual de gcc.

Continuando, la opción -Wextra también emite advertencias en los siguientes casos:

  • Un puntero se compara con cero entero con <, <=, >, o >=
  • (solo C++) Un enumerador y un no enumerador aparecen en una expresión condicional.
  • (solo C++) Bases virtuales ambiguas.
  • (solo C++) Subscripting un array que ha sido declarado register.
  • (solo C++) Tomando la dirección de una variable que ha sido declarada register.
  • (solo C++) Una clase base no se inicializa en el constructor de copia de una clase derivada.

Habilitar advertencias para valores de punto flotante en comparaciones de igualdad

Como ya sabes, nunca se debe probar la igualdad exacta de valores de punto flotante (si no lo sabías - lee la FAQ relacionada con la comparación de punto flotante aquí). Pero incluso si accidentalmente haces esto, ¿el compilador gcc lanza alguna advertencia o error? Vamos a comprobarlo:

Aquí hay un código que compara variables de punto flotante usando el operador ==:

#include  
  
vacío comparar(float x, float y)  
{  
    if(x == y)  
    {  
        printf("\n IGUAL \n");  
    }  
}  
  
int main(void)  
{  
    comparar(1.234, 1.56789);  
   
    return 0;   
}

Y aquí está el comando gcc (que contiene tanto las opciones -Wall como -Wextra) utilizado para compilar este código:

gcc -Wall -Wextra test.c -o test

Desafortunadamente, el comando anterior no produce ninguna advertencia relacionada con la comparación de punto flotante. Una rápida mirada a la página del manual de GCC revela que existe una opción dedicada -Wfloat-equal que debe usarse en estos escenarios.

Aquí está el comando que contiene esta opción:

gcc -Wall -Wextra -Wfloat-equal test.c -o test

Y a continuación está la salida que produjo:

test.c: En la función ‘comparar’:  
test.c:5:10: advertencia: comparar punto flotante con == o != es inseguro [-Wfloat-equal]  
 if(x == y)

Así que, como puedes ver en la salida anterior, la opción -Wfloat-equal obligó a gcc a producir una advertencia relacionada con la comparación de flotantes.

Aquí está lo que dice la página del manual de gcc sobre esta opción:

La idea detrás de esto es que a veces es conveniente (para el programador) considerar los valores de punto flotante como aproximaciones a números reales infinitamente precisos. Si estás haciendo esto, entonces necesitas calcular (analizando el código, o de alguna otra manera) el error máximo o probable que la computación introduce, y permitirlo al realizar comparaciones (y al producir salida, pero ese es un problema diferente). En particular, en lugar de probar la igualdad, deberías comprobar si los dos valores tienen rangos que se superponen; y esto se hace con los operadores relacionales, por lo que las comparaciones de igualdad probablemente son erróneas.

Cómo gestionar mejor las opciones de línea de comandos de gcc

Si la lista de opciones de línea de comandos que estás utilizando en tu comando gcc se está volviendo más grande y difícil de gestionar, entonces puedes ponerla en un archivo de texto y pasar el nombre de ese archivo como un argumento al comando gcc. Para esto, tendrás que usar la opción @file.

Por ejemplo, si el siguiente es tu comando gcc:

gcc -Wall -Wextra -Wfloat-equal test.c -o test

Entonces puedes poner las tres opciones relacionadas con advertencias en un archivo llamado, digamos, ‘gcc-options’:

$ cat gcc-options   
-Wall -Wextra -Wfloat-equal

Y tu comando gcc se vuelve menos desordenado y fácil de gestionar:

gcc @gcc-options test.c -o test

Aquí está lo que dice la página del manual de gcc sobre @file:

Leer opciones de línea de comandos desde el archivo. Las opciones leídas se insertan en lugar de la opción original @file. Si el archivo no existe, o no se puede leer, entonces la opción se tratará literalmente, y no se eliminará.  
  
Las opciones en el archivo están separadas por espacios en blanco. Un carácter de espacio en blanco puede incluirse en una opción rodeando toda la opción con comillas simples o dobles. Cualquier carácter (incluyendo una barra invertida) puede incluirse prefijando el carácter que se va a incluir con una barra invertida. El archivo puede contener opciones adicionales @file; cualquier opción de este tipo se procesará recursivamente.

Conclusión

Así que cubrimos un total de 5 opciones de línea de comandos de gcc poco comunes pero útiles en esta serie de tutoriales: -save-temps, -g, -Wextra, -Wfloat-equal, y @file. Dedica tiempo a practicar cada una de ellas y no olvides revisar todos los detalles que la página del manual de gcc ofrece sobre ellas.

¿Conoces o usas otras opciones de línea de comandos de gcc útiles y quieres compartirlas con el mundo? Deja todos los detalles en los comentarios a continuación.

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.