IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Langage C et normes ANSI


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 2
    Par défaut Langage C et normes ANSI
    Bonjour,
    Voulant me lancer dans la programmation (simplement pour le plaisir, et l'envie de comprendre ce que peut-être un langage de programmation), j'ai trouvé d'occasion "Le langage C" de B.W. Kernighan et D.M. Ritchie. Il s'agit de la première édition francaise, datée de 1983.
    Comme tout le monde j'ai commencé par le programme "Hello World".
    J'ai donc conscienceusement recopié le code du livre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    main()
    {
          printf("Hello, world\n");
    }
    En le compilant sous gcc mais j'obtiens le message suivant : [CODE]hello1.c: Dans la fonction «main» :
    hello1.c:3: attention : incompatible implicit declaration of built-in function «printf»

    Si je change le code par celui que l'on trouve dans le WikiBook de Wikipedia consacré au Langage C, à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
          #include <stdio.h>
          int main(void)
          {
              printf("Bonjour !\n");
              return 0;
          }
    Je n'ai aucun message d'erreur et je peux exécuter mon programme.
    Alors j'aurais voulu savoir quelles étaient les différences entre ces deux codes? Est-ce la norme ANSI qui créee ces différences?
    C'est pour cette raison que j'ai précisé la date de l'édition française du livre de K&R.
    Merci d'avance

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    C'est en effet une des nombreuses différences entre le C tel que décrit dans la première édition du K&R et celui qui a été normalisé en 89.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par silencio Voir le message
    Je n'ai aucun message d'erreur et je peux exécuter mon programme. Alors j'aurais voulu savoir quelles étaient les différences entre ces deux codes?
    En regardant bien le code, tu t'aperçois que trois choses distinguent le second du premier :

    - Ajout de #include <stdio.h> ;
    - Prototype passé de void main() à int main (void) ;
    - Ajout de return 0; en fin de fonction.

    C'est le fichier stdio.h qui contient entre autres le prototype de la fonction printf(), qui dit au compilo comment on utilise la fonction. En principe, en l'absence d'un tel prototype, gcc devrait refuser d'aller plus loin en arguant qu'il ne connaît pas cette fonction. Mais printf() fait partie du standard C depuis la première heure et, à ce titre, gcc embarque un certain nombre de fonctions built-in principalement pour des raisons d'optimisation (dixit la man-page). Or, il se trouve que ta manière (pourtant normale) de l'utiliser est incompatible avec le prototype prédéfini dans le compilateur. Mais avec un fichier de déclaration en bonne et due forme, tout rentre dans l'ordre.

    Pour main() qui passe de void à int, c'est une règle de bon usage qui a fini par être imposée en C++, notamment : une fonction main() qui se termine engendre la fin du programme, comme avec exit(). Du point de vue du programme lui-même, il n'a pas de résultat particulier à renvoyer, mais du point de vue du système, celui-ci attend au moins un code de retour (0 quand tout s'est bien passé, généralement). D'où le return 0; explicite en fin de programme.

    C'est utile car ton programme peut être vu comme un module ou une fonction appelée par une instance de plus haut niveau. Ça a commencé à se matérialiser avec le C++, et c'est devenu flagrant avec Java, par exemple, qui oblige à encapsuler ton application dans une classe, qui peut alors être instanciée comme n'importe quel autre objet.

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Pour Silencio: prend un bouquin plus récent (la seconde édition du même
    bouquin si le style te plait). Il y a trop de différences en le C K&R tel
    que décrit par la première édition et le C pratiqué de nos jours. Il y
    avait déjà beaucoup de différence entre le C du bouquin et celui pratiqué
    au moment de la publication de la traduction française que tu as.

    Le reste de mon message n'a guère plus qu'un intérêt historique et risque
    de te causer plus de confusion que de bien.

    Ne pas oublie qu'un des objectifs de la normalisation a été de remettre de l'ordre dans les différentes implémentations du C qui florissaient a l'époque (fin des années 70, début des années 80).

    Citation Envoyé par Obsidian Voir le message
    En regardant bien le code, tu t'aperçois que trois
    choses distinguent le second du premier :

    - Ajout de #include <stdio.h> ;
    - Prototype passé de void main() à int main (void) ;
    - Ajout de return 0; en fin de fonction.

    C'est le fichier stdio.h qui contient entre autres le prototype de
    la fonction printf(), qui dit au compilo comment on utilise la
    fonction. En principe, en l'absence d'un tel prototype, gcc devrait
    refuser d'aller plus loin en arguant qu'il ne connaît pas cette
    fonction. Mais printf() fait partie du standard C depuis la première
    heure et, à ce titre, gcc embarque un certain nombre de fonctions
    built-in principalement pour des raisons d'optimisation (dixit la
    man-page). Or, il se trouve que ta manière (pourtant normale) de
    l'utiliser est incompatible avec le prototype prédéfini dans le
    compilateur. Mais avec un fichier de déclaration en bonne et due forme,
    tout rentre dans l'ordre.
    L'utilisation implicite de fonctions est toujours valide en général. Mais
    il faut alors que l'usage corresponde bien à la définition, ce qui fait
    qu'il faut une déclaration (entre autres):

    - quand le type de retour n'est pas int (cas le plus courant, les pointeurs
    -- malloc! -- et les doubles)

    - pour les fonctions variadiques.

    Ces règles ont été introduites dés qu'on en a eu besoin (et je n'ai aucune
    idée de quand ce fut par rapport à la publication de K&R1), mais l'usage a
    été longtemps de ne pas s'en préoccuper tant que ça ne posait pas problème
    sur les cibles considérées.

    Pour main() qui passe de void à int, c'est une
    règle de bon usage qui a fini par être imposée en C++, notamment : une
    fonction main() qui se termine engendre la fin du programme, comme
    avec exit(). Du point de vue du programme lui-même, il n'a pas de
    résultat particulier à renvoyer, mais du point de vue du système, celui-ci
    attend au moins un code de retour (0 quand tout s'est bien passé,
    généralement). D'où le return 0; explicite en fin de
    programme.
    Où as-tu vu qu'on est passé d'un type de retour void à int? void n'existe
    pas dans le C K&R! Dans les deux cas le type de retour de main est int.
    Les différences entre les deux sont:

    - l'utilisation ou non du type de retour int implicite (d'usage normal en C
    K&R, de mauvais style en C90, plus possible en C99)

    - l'utilisation de void dans la liste de paramètres. Il n'y a pas de void
    en C K&R. En C90 et en C99 le choix est le plus souvent une question de
    style mais la forme avec void me semble préférable (il y a une différence
    subtile entre la forme sans void et celle avec void, la première
    déclarant main sans lui donner de prototype, la seconde en lui en donnant
    un, ce qui pour main() n'a que rarement un effet pratique; pour d'autres
    fonctions l'effet est qu'il faut préférer la forme avec le void et je ne
    vois pas de raison de faire une différence pour main).

    L'absence du return est aussi problématique en C K&R, mais la situation est
    la même que pour la nécessité d'une déclaration.

  5. #5
    Nouveau candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 2
    Par défaut
    Merci à tous pour vos réponses.
    Donc si je comprend bien, du moment qu'un livre couvre le C selon les normes ANSI? Sur Priceminister j'ai trouvé le K&R avec la normes ANSI
    http://www.priceminister.com/offer/b...e-C-Livre.html
    Mais il a été publié en 95 d'après la fiche de Priceminister, est-ce que c'est bon? Sinon il est dispo en neuf, dans sa dernière édition sur Amazon, mais ce n'est plus le même prix.

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par silencio Voir le message
    Merci à tous pour vos réponses.
    Donc si je comprend bien, du moment qu'un livre couvre le C selon les normes ANSI? Sur Priceminister j'ai trouvé le K&R avec la normes ANSI
    http://www.priceminister.com/offer/b...e-C-Livre.html
    Mais il a été publié en 95 d'après la fiche de Priceminister, est-ce que c'est bon? Sinon il est dispo en neuf, dans sa dernière édition sur Amazon, mais ce n'est plus le même prix.
    C'est le bon. Il n'y a eu que 2 versions. C'est la deuxième.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Si tu prends le K&R2, n'oublie pas les errata qui vont avec. Notamment, une position officielle sur l'emploi de malloc() (allocation dynamique) a changé...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par silencio Voir le message
    Bonjour,
    Voulant me lancer dans la programmation (simplement pour le plaisir, et l'envie de comprendre ce que peut-être un langage de programmation), j'ai trouvé d'occasion "Le langage C" de B.W. Kernighan et D.M. Ritchie. Il s'agit de la première édition francaise, datée de 1983.
    Comme tout le monde j'ai commencé par le programme "Hello World".
    http://emmanuel-delahaye.developpez.com/init_c.htm

Discussions similaires

  1. [Livre] Le langage C - Norme ANSI, 2ème édition
    Par djibril dans le forum Livres
    Réponses: 0
    Dernier message: 16/06/2014, 17h09
  2. Réponses: 21
    Dernier message: 30/08/2013, 16h42
  3. Langage C norme ANSI
    Par Deamonix dans le forum Débuter
    Réponses: 9
    Dernier message: 21/09/2009, 18h55
  4. Vends ou échange livre "Le langage C : norme ANSI"
    Par jerome71300 dans le forum Lectures
    Réponses: 0
    Dernier message: 14/02/2008, 13h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo