FAQ CConsultez toutes les FAQ

Nombre d'auteurs : 28, nombre de questions : 175, création le 11 janvier 2013 

 
OuvrirSommaireDiversDivers

Le langage C exige une grande rigueur lors de l'écriture du code. Il peut être fastidieux de vérifier que toutes les variables sont correctement initialisées, ou encore détecter les erreurs tel que la confusion entre le opérateur = et ==. Heureusement, le compilateur gcc est capable de détecter ce genre d'erreur, il suffit pour cela de lui passer un certain nombre d'arguments. Voici la ligne de commande type qui permet de faire du code conforme à la norme ANSI (C89) et de corriger un grand nombre de comportements indéfinis :

 
Sélectionnez

-O2 -Wall -W -Werror -ansi -pedantic

Cependant ces options peuvent être trop contraignantes : par exemple, avec GTK+ les prototypes des fonctions callback sont imposés, mais il se peut que tous les arguments ne vous servent pas dans la fonction, dans ce cas gcc refusera de compiler votre code. Pour pallier ce problème, utilisez plutot les options :

 
Sélectionnez

-O2 -Wall -Werror -ansi -pedantic

Notons que ces options forcent le compilateur à passer en mode "C89 strict", pour pouvoir utiliser le mode "C99", il faut remplacer -ansi par -std=c99, la ligne d'option devient donc :

 
Sélectionnez

-O2 -Wall -Werror -std=c99 -pedantic

Attention : contrairement à ce que son nom peut laisser penser, -Wall n'active pas tous les warning mais tous ceux jugés importants par l'équipe de gcc.

Créé le 2006-09-11  par gege2061, gl, Anomaly

Lien : GCC Home Page

Il signifie la plupart du temps que la fonction ou la macro en question n'est pas standard (donc pas très portable ...). Plus précisément, qu'elle fait partie de la version de la bibliothèque standard proposée par l'environnement que vous utilisez mais qu'elle n'est pourtant pas reconnue par la norme. Par exemple, les fonctions et macros DOS/Windows _getch, _kbhit, _spawn*, _P_WAIT, etc. font partie de la bibliothèque du C (appelée CRT sous Windows pour C Run-Time Library) alors qu'elles ne sont pas standard, d'où l'underscore. Cette règle de l'underscore ne s'applique toutefois bien évidemment pas aux fonctions des bibliothèques tierces qui accompagnent le compilateur (APIs du système et autres bibliothèques spécifiques). Par exemple, sous les systèmes supportant POSIX (c'est-à-dire UNIX et tous ses clones), les fonctions read, write, exec* font partie de l'API POSIX (on les appelle souvent "appels systèmes" car se sont la plupart du temps des fonctions du système) et non de la bibliothèque du C donc pas besoin d'underscore. L'API POSIX est cependant proposée en tant qu'extension de CRT sous Windows (et elle n'est pas supportée à 100% ...) d'où l'apparition des noms avec underscore (_read, _write, _exec*, etc.).

Cette convention de nommage fut adoptée pour la première fois par le langage C++ et est utilisée aujourd'hui par tous les compilateurs respectant la norme de ce langage (la première version de cette norme date de 1998). Elle n'est pas obligatoire en C, mais beaucoup de compilateurs C (ou C++ ...) sont en fait des compilateurs C/C++ (c'est-à-dire qu'ils savent compiler aussi bien du code C que du code C++, même si ce sont des langages différents) donc ils appliquent ce système aux deux langages, ce qui n'est pas incompatible avec la norme du C.

Pour les mot-clés non standard, on met deux underscores en avant au lieu d'un seul. Par exemple : __declspec, __stdcall, __asm, __int32, __int64, etc.

Créé le 2009-06-15  par Melem

Cette erreur est due à l'absence de la fonction WinMain. Cette fonction remplace le main d'un programme C standard dans le cas d'un programme spécifiquement conçu pour Windows. Pour supprimer cette erreur, modifiez le type de votre projet en projet d'application console.

Créé le 2005-11-07  par gege2061

La norme stipule qu'une ligne complète doit être terminée par un saut de ligne. Ce warning signale que la dernière ligne du fichier n'est pas complète. Pour supprimer ce warning, il suffit de la compléter.

Créé le 2005-11-07  par gl

Sous Windows, lorsqu'on lance une application console depuis l'interface graphique (c'est-à-dire en double-cliquant), une console se crée pour faire tourner le programme et se détruit aussitôt que ce dernier ait terminé. Pour maintenir la console jusqu'à ce que l'utilisateur tape une touche pour la fermer, il suffit d'ajouter une instruction bloquante juste avant de quitter la fonction main, par exemple à l'aide de 'system("pause");'.

 
Sélectionnez
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    printf("Hello World !\n");
    system("PAUSE");
    return 0;
}

N.B : Dans certains EDI (Code::Blocks, Visual C++, etc.), la commande 'Lancer' ('Run') qui permet de tester un programme sans quitter l'EDI ne lance pas directement le programme, surtout quand ce dernier est une application console, mais lance un programme qui va à son tour lancer le vôtre puis après que ce dernier ait terminé, affiche un message vous invitant à appuyer sur une touche pour fermer la console. Ce message ne fait donc pas du tout partie de votre programme.

Mis à jour le 2009-03-23  par Aurelien.Regat-Barrel, gl
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2013 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée.