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 :

Est-il normal que mon header ne soit pas indispensable?!


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Par défaut Est-il normal que mon header ne soit pas indispensable?!
    Salut,
    J'ai bien compris le principe de la programmation modulaire comme telle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /* main.c */
    #include "hello.h"
    int main (void)
    {
       hello ();
       return 0;
    }
           
    /* hello.h */
    #ifndef H_HELLO
    #define H_HELLO
    void hello (void);
    #endif /* guard */
    
    /* hello.c */
    #include "hello.h"
    #include <stdio.h>
    void hello (void)
    {
       puts ("Hello world!");
    }
    mais je ne comprends pas pourquoi cela marche quand même sans le fichier .h (ou de manière équivalente si je met les #include "hello.h" en comentaires).
    On dit partout que c'est la bonne manière d'organiser ses fichiers, mais pourquoi mon .h semble être facultatif??! Est-il obligatoire finalement?
    Merci d'avance,
    @+

  2. #2
    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 makro Voir le message
    mais je ne comprends pas pourquoi cela marche quand même sans le fichier .h (ou de manière équivalente si je met les #include "hello.h" en comentaires).
    On dit partout que c'est la bonne manière d'organiser ses fichiers, mais pourquoi mon .h semble être facultatif??! Est-il obligatoire finalement?
    Merci d'avance,
    @+
    Non, ce n'est pas obligatoire.

    1 - tu pourrais fournir le prototype 'a la main', mais la maintenance deviendrait cauchemardesque
    2 - tu pourrais ne pas fournir de prototype, et dans ce cas, ça pourrait fonctionner (ou non, tout dépend des types), mais tu prives le compilateur des éléments indispensables qui lui permettent de coder l'appel correctement et de vérifier la cohérence des appels.

    Il existe 40.000 façons de se tirer une balle dans le pied en C. Nous nous efforçons de promouvoir les quelques Bonnes Pratiques qui évitent ça.

    Donc le mécanisme que tu as décrit est fortement encouragé pour ne pas dire obligatoire, du moins vu des Règles de Bonnes Pratiques.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Par défaut
    Merci pour ta réponse, j'en prends bonne note.

  4. #4
    Membre très actif Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Par défaut
    Ça m'arrive souvent sous code::blocks (implicite declaration of ..... ) et sous visual si il manque quoi que se soit il compile pas .

  5. #5
    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 elmcherqui Voir le message
    Ça m'arrive souvent sous code::blocks (implicite declaration of ..... ) et sous visual si il manque quoi que se soit il compile pas .
    Ça, c'est parce que tu compiles en C++... Caÿ mal.

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 145
    Billets dans le blog
    150
    Par défaut
    D'ailleurs , pour éviter les balles dans le pied , on active les warnings , et aussi on respecte la norme. ( Certain mettront les warning en erreurs ... mais ça peut être excessifs ( enfin ça dépend du cas ) )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    D'ailleurs , pour éviter les balles dans le pied , on active les warnings , et aussi on respecte la norme. ( Certain mettront les warning en erreurs ... mais ça peut être excessifs ( enfin ça dépend du cas ) )
    C'est mon cas. Pourquoi est-ce excessif ?

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Quand tu as un warning "condition constante" pour ta macro qui contient un do {} while(0), c'est excessif.
    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.

  9. #9
    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 Médinoc Voir le message
    Quand tu as un warning "condition constante" pour ta macro qui contient un do {} while(0), c'est excessif.
    Ca n'arrive pas avec gcc... Pour ça, il faut au moins VC++...

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    moi je dirais que le warning qui m'énerve le plus et que je ne mettrais jamais en erreur c'est "variable non initiialisée".. j'le sais bien, c'est moi qui l'ai fait exprès... Puisque je lui mets une valeur dedans à un moment donné, et pas avant... grrr....

  11. #11
    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 souviron34 Voir le message
    moi je dirais que le warning qui m'énerve le plus et que je ne mettrais jamais en erreur c'est "variable non initiialisée".. j'le sais bien, c'est moi qui l'ai fait exprès... Puisque je lui mets une valeur dedans à un moment donné, et pas avant... grrr....
    Ce warning n'existe pas. Ce qui existe, c'est "risque d'utilisation de variable non initialisée'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    #include <stdio.h>
     
    int f (int x)
    {
       int ret;
     
       if (x > 4)
       {
          ret = 1;
       }
       return ret;
    }
     
    int main (void)
    {
       int x = f (3);
     
       printf ("x = %d\n", x);
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    -------------- Build: Debug in hello ---------------
     
    Compiling: main.c
    Linking console executable: bin\Debug\hello.exe
    C:\dev\hello\main.c: In function `f':
    C:\dev\hello\main.c:5: warning: 'ret' might be used uninitialized in this function
    Output size is 18.08 KB
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 1 warnings
    Ce qui est toutà fait justifié. Evidemment, avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    int f (int x)
    {
       int ret;
     
       if (x > 4)
       {
          ret = 1;
       }
       else
       {
          ret = 0;
       }
       return ret;
    }
    le warning disparait.

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    vi ok

    mais "might be used uninitialized" m'énerve

  13. #13
    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 souviron34 Voir le message
    vi ok

    mais "might be used uninitialized" m'énerve
    Pourquoi ? C'est un vrai bug.

  14. #14
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Pourquoi ? C'est un vrai bug.
    bah non....


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int toto=1, tata, titi ;
     
    if ( toto == 1 )
        tata = 3 ;
     
    ....
     
    if ( toto == 1 )
       {
              titi = tata + toto ;
              ....
       }
    ça n'est un bug que si on se contente de déclarer les varaibles uniquement par blocs. Si la variable est globale à la fonction, et qu'on s'en sert comme ci-dessus, ça n'est pas un bug...

    Peut-être que ça ne correspond pas à ta pratique, mais ça n'est quand même pas un bug..

  15. #15
    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 souviron34 Voir le message
    Peut-être que ça ne correspond pas à ta pratique, mais ça n'est quand même pas un bug..
    C'est difficile à suivre dans un code complexe... on a pas besoin de ça ! D'ailleurs, l'optimiseur de gcc jette l'éponge, et moi aussi. je préfère le code facile à lire. Ce n'est effectivement pas ma pratique (enfin j'évite).

  16. #16
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Par défaut
    Puis ce n'est pas maintenable, imagines qqjours apres tu changes ton code pour une raison X et tu as laisse le warning .
    Pour que peu que tu ai introduit une utilisation systematique de la variable alors qu'elle n'est pas forcement initialise, tu auras des comportement bizarres (et au mieux un segfault)

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/09/2014, 09h48
  2. Réponses: 2
    Dernier message: 24/01/2013, 15h31
  3. Réponses: 8
    Dernier message: 20/04/2012, 22h37
  4. Est-ce normal dans mon grub?
    Par Jean-Michel Ormes dans le forum Ubuntu
    Réponses: 14
    Dernier message: 30/06/2008, 21h27
  5. est ce normal que le module NET::FTP soit TRES lent ?
    Par ramislebob dans le forum Modules
    Réponses: 4
    Dernier message: 14/03/2006, 09h13

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