GCC Options · 6 min read · Jan 22, 2026

Options de ligne de commande GCC peu communes mais utiles - partie 2

Le compilateur gcc offre une liste apparemment sans fin d’options de ligne de commande. Bien sûr, personne n’utilise ou n’a d’expertise sur toutes, mais il y a un certain nombre d’entre elles que chaque utilisateur de gcc devrait - sinon doit - connaître. Alors que certaines d’entre elles sont couramment utilisées, d’autres sont un peu moins communes mais tout aussi utiles.

Dans cette série d’articles, nous nous concentrons sur certaines de ces options de ligne de commande gcc peu communes mais utiles, et nous en avons déjà couvert quelques-unes dans la partie 1.

Si vous vous en souvenez, au début de la première partie de cette série de tutoriels, j’ai brièvement mentionné que l’option -Wall que les développeurs utilisent généralement pour générer des avertissements ne couvre pas certains avertissements spécifiques. Si vous n’êtes pas au courant de ces avertissements et n’avez aucune idée de la façon de les activer, ne vous inquiétez pas, car nous expliquerons tout cela en détail dans cet article.

En plus de cela, nous couvrirons également une option d’avertissement gcc liée aux variables à virgule flottante, ainsi que la manière de mieux gérer les options de ligne de commande gcc si la liste devient longue.

Mais avant d’aller plus loin, veuillez garder à l’esprit que tous les exemples, commandes et instructions mentionnés dans ce tutoriel ont été testés sur Ubuntu 16.04 LTS, et la version de gcc que nous avons utilisée est 5.4.0.

** Activer les avertissements qui ne sont pas couverts par -Wall

Bien que l’option -Wall du compilateur gcc couvre la plupart des drapeaux d’avertissement, certains restent désactivés. Pour les activer, utilisez l’option -Wextra.

Par exemple, regardez le code suivant :

#include   
#include   
int main()  
{  
    int i=0;  
    /* ...  
       some code here   
       ...  
    */  
      
    if(i);  
        return 1;  
     return 0;   
}

J’ai accidentellement mis un point-virgule après la condition ‘if’. Maintenant, lorsque le code a été compilé en utilisant la commande gcc suivante, aucun avertissement n’a été produit.

gcc -Wall test.c -o test

Mais lorsque l’option -Wextra a été utilisée :

gcc -Wall -Wextra test.c -o test

Un avertissement a été produit :

test.c: In function ‘main’:  
test.c:10:8: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body]  
 if(i);

Comme il est clair d’après l’avertissement ci-dessus, l’option -Wextra a activé en interne le drapeau -Wempty-body, qui a détecté le code suspect et émis l’avertissement. Voici la liste complète des drapeaux d’avertissement activés par cette option :

-Wclobbered, -Wempty-body, -Wignored-qualifiers, -Wmissing-field-initializers, -Wmissing-parameter-type (C uniquement), -Wold-style-declaration (C uniquement), -Woverride-init, -Wsign-compare, -Wtype-limits, -Wuninitialized, -Wunused-parameter (uniquement avec -Wunused ou -Wall), et -Wunused-but-set-parameter (uniquement avec -Wunused ou -Wall).

Si vous voulez savoir ce que font les drapeaux mentionnés ci-dessus, rendez-vous sur la page man de gcc.

En continuant, l’option -Wextra émet également des avertissements dans les cas suivants :

  • Un pointeur est comparé à zéro entier avec <, <=, >, ou >=
  • (C++ uniquement) Un énumérateur et un non-énumérateur apparaissent tous deux dans une expression conditionnelle.
  • (C++ uniquement) Bases virtuelles ambiguës.
  • (C++ uniquement) Indexation d’un tableau qui a été déclaré registre.
  • (C++ uniquement) Prendre l’adresse d’une variable qui a été déclarée registre.
  • (C++ uniquement) Une classe de base n’est pas initialisée dans le constructeur de copie d’une classe dérivée.

Activer l’avertissement pour les valeurs à virgule flottante dans les comparaisons d’égalité

Comme vous le savez peut-être déjà, on ne doit jamais tester l’égalité exacte des valeurs à virgule flottante (vous ne le saviez pas - lisez la FAQ liée à la comparaison de virgule flottante ici). Mais même si vous le faites accidentellement, le compilateur gcc émet-il un avertissement ou une erreur ? Vérifions :

Voici un code qui compare des variables à virgule flottante en utilisant l’opérateur == :

#include  
  
void compare(float x, float y)  
{  
    if(x == y)  
    {  
        printf("\n EQUAL \n");  
    }  
}  
  
int main(void)  
{  
    compare(1.234, 1.56789);  
   
    return 0;   
}

Et voici la commande gcc (contenant à la fois les options -Wall et -Wextra) utilisée pour compiler ce code :

gcc -Wall -Wextra test.c -o test

Malheureusement, la commande ci-dessus ne produit aucun avertissement lié à la comparaison de virgule flottante. Un rapide coup d’œil à la page man de GCC révèle qu’il existe une option dédiée -Wfloat-equal qui devrait être utilisée dans ces scénarios.

Voici la commande contenant cette option :

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

Et voici la sortie qu’elle a produite :

test.c: In function ‘compare’:  
test.c:5:10: warning: comparing floating point with == or != is unsafe [-Wfloat-equal]  
 if(x == y)

Comme vous pouvez le voir dans la sortie ci-dessus, l’option -Wfloat-equal a forcé gcc à produire un avertissement lié à la comparaison de virgule flottante.

Voici ce que dit la page man de gcc à propos de cette option :

L'idée derrière cela est que parfois il est pratique (pour le programmeur) de considérer les valeurs à virgule flottante comme des approximations de nombres réels infiniment précis. Si vous faites cela, alors vous devez calculer (en analysant le code, ou d'une autre manière) l'erreur maximale ou probablement maximale que le calcul introduit, et en tenir compte lors des comparaisons (et lors de la production de sortie, mais c'est un autre problème). En particulier, au lieu de tester l'égalité, vous devriez vérifier si les deux valeurs ont des plages qui se chevauchent ; et cela se fait avec les opérateurs relationnels, donc les comparaisons d'égalité sont probablement erronées.

Comment mieux gérer les options de ligne de commande gcc

Si la liste des options de ligne de commande que vous utilisez dans votre commande gcc devient plus longue et difficile à gérer, vous pouvez la mettre dans un fichier texte et passer le nom de ce fichier comme argument à la commande gcc. Pour cela, vous devrez utiliser l’option @file.

Par exemple, si la commande gcc suivante est la vôtre :

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

Alors vous pouvez mettre les trois options liées aux avertissements dans un fichier nommé, disons ‘gcc-options’ :

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

Et votre commande gcc devient moins encombrée et plus facile à gérer :

gcc @gcc-options test.c -o test

Voici ce que dit la page man de gcc à propos de @file :

Lire les options de ligne de commande à partir du fichier. Les options lues sont insérées à la place de l'option @file d'origine. Si le fichier n'existe pas, ou ne peut pas être lu, alors l'option sera traitée littéralement, et non supprimée.  

Les options dans le fichier sont séparées par des espaces. Un caractère d'espace peut être inclus dans une option en entourant l'option entière de guillemets simples ou doubles. Tout caractère (y compris un antislash) peut être inclus en préfixant le caractère à inclure avec un antislash. Le fichier peut lui-même contenir des options @file supplémentaires ; toutes ces options seront traitées de manière récursive.

Conclusion

Nous avons donc couvert un total de 5 options de ligne de commande gcc peu communes mais utiles dans cette série de tutoriels : -save-temps, -g, -Wextra, -Wfloat-equal, et @file. Prenez le temps de pratiquer chacune d’elles et n’oubliez pas de consulter tous les détails que la page man de gcc propose à leur sujet.

Connaissez-vous ou utilisez-vous d’autres options de ligne de commande gcc utiles, et souhaitez-vous les partager avec le monde ? Laissez tous les détails dans les commentaires ci-dessous.

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.