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 :

Différence de déclarations avec "const"


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 140
    Par défaut Différence de déclarations avec "const"
    Bonjour,

    je me souviens d'un sujet (que je ne retrouve plus) où il y avait une explication des différentes déclarations :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const char * pt_word;
    char * const pt_word;
    const char * const pt_word;

    si quelqu'un peut donner plus d'informations sur ces déclarations (si elles existent toutes).
    Merci

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 140
    Par défaut
    Très bon sujet aussi pour l'info qu'il contient, mais ce n'est pas celui-ci.
    Je me souviens particulièrement d'une personne qui expliquait justement la portée du const suivant qu'il se trouvait à gauche ou à droite d'un mot.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const char * pt_word; // pointeur non constant sur une donnée constante
    char * const pt_word; // pointeur constant sur une donnée non constante
    const char * const pt_word; // pointeur constant sur une donnée constante
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 450
    Par défaut
    Bonjour,

    Citation Envoyé par MicBeastKiller Voir le message
    Bonjour,

    je me souviens d'un sujet (que je ne retrouve plus) où il y avait une explication des différentes déclarations :
    Celui-ci, peut-être : http://www.developpez.net/forums/d12...r/#post6683664
    Mais il se trouve dans le forum C++.

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 140
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Bonjour,
    Celui-ci, peut-être : http://www.developpez.net/forums/d12...r/#post6683664
    Mais il se trouve dans le forum C++.
    C'était sûrement celui-ci.
    Il y a en tout cas toutes les explications.
    Merci à tous.

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Faudra juste vérifier les corrections apportées dans l'avant-dernier message

    Dans n1256, il y a l'exemple donné au point 28 de la partie 6.2.5 Types qui est intéressant :
    EXAMPLE 1 The type designated as ‘‘float *’’ has type ‘‘pointer to float’’. Its type category is
    pointer, not a floating type. The const-qualified version of this type is designated as ‘‘float * const’’
    whereas the type designated as ‘‘const float *’’ is not a qualified type — its type is ‘‘pointer to constqualified
    float’’ and is a pointer to a qualified type.
    Il y en a un autre dans la partie 6.7.5.1 Pointer declarators, au point 3 :
    EXAMPLE The following pair of declarations demonstrates the difference between a ‘‘variable pointer
    to a constant value’’ and a ‘‘constant pointer to a variable value’’.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const int *ptr_to_constant;
    int *const constant_ptr;
    The contents of any object pointed to by ptr_to_constant shall not be modified through that pointer,
    but ptr_to_constant itself may be changed to point to another object. Similarly, the contents of the
    int pointed to by constant_ptr may be modified, but constant_ptr itself shall always point to the
    same location.
    suivi par le point 4 :
    The declaration of the constant pointer constant_ptr may be clarified by including a definition for the
    type ‘‘pointer to int’’.
    typedef int *int_ptr;
    const int_ptr constant_ptr;
    declares constant_ptr as an object that has type ‘‘const-qualified pointer to int’’.

  9. #9
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 140
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Faudra juste vérifier les corrections apportées dans l'avant-dernier message
    En fait, je vais faire référence à ce message :
    http://www.developpez.net/forums/d11...buter/const-c/

  10. #10
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 140
    Par défaut
    Par contre je ne peux faire de cette manière là :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int maFonction( int unEntier const , char * unMot const )
    {
        /* code */
    }
    mettre le "const" à la fin ?

  11. #11
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par MicBeastKiller Voir le message
    Par contre je ne peux faire de cette manière là :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int maFonction( int unEntier const , char * unMot const )
    {
        /* code */
    }
    mettre le "const" à la fin ?
    Non, car const "porte" sur ce qu'il suit, c'est a dire rien dans le cas que tu cites.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  12. #12
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Visiblement non :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int f(int const p1, int p2 const)
    {
        return p1 + p2;
    }
     
    int main(void)
    {
        const int a = 2;
        int const b = 3;
     
        //int c const = 4; // invalide
     
        return f(a,b);
    }
    Me dit que f est implicitement déclarée à l'avant-dernière ligne.

    EDIT : en compilant en C++, il y a une erreur lors de la déclaration de la fonction f().

    EDIT 2 : en compilant en C avec l'option -pedantic, la définition de la fonction génère aussi une erreur.

  13. #13
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 140
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Non, car const "porte" sur ce qu'il suit, c'est a dire rien dans le cas que tu cites.
    Or cela est possible pour déclarer des variables ?
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int unEntier const;
    char * unMot const;

  14. #14
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par MicBeastKiller Voir le message
    Or cela est possible pour déclarer des variables ?
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int unEntier const;
    char * unMot const;
    Non, voir mon code précédent : en dé-commentant la ligne commentée, il y a un erreur de compilation.



    Citation Envoyé par gangsoleil
    Non, car const "porte" sur ce qu'il suit, c'est a dire rien dans le cas que tu cites.
    on peut juste inverser const et le type comme le montre le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main(void)
    {
        const int a = 2;
        int const b = 3;
     
        const int * p1 = malloc(sizeof(int));
        int const * p2 = malloc(sizeof(int));
     
        return 0;
    }

  15. #15
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 140
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Non, voir mon code précédent : en dé-commentant la ligne commentée, il y a un erreur de compilation.
    Ce n'est donc pas permis (du moins en C).

    Citation Envoyé par Bktero Voir le message
    pour les pointeurs, on peut inverser const et le type comme le montre le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main(void)
    {
        const int * p1 = malloc(sizeof(int));
        int const * p2 = malloc(sizeof(int));
     
        p1 = p2;
        p2 = p1;
     
        *p1 = 1;
        *p2 = 2;
    }
    C'est d'ailleurs ce qui est indiqué dans tous les liens fournis précédemment.

    Merci en tout cas de vos réponses.

  16. #16
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par MicBeastKiller Voir le message
    Ce n'est donc pas permis (du moins en C).
    Ni en C++ visiblement.

    Citation Envoyé par MicBeastKiller Voir le message
    Merci en tout cas de vos réponses.
    De rien

  17. #17
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 140
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Ni en C++ visiblement.
    Alors certains points de ceci ne sont pas corrects ?
    http://www.developpez.net/forums/d12...r/#post6683664

  18. #18
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Contrairement à ce qui a été dit plus haut et dans d'autre messages, je trouve plus simple de considérer que ce qui est constant, c'est ce qui suit le "const". Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int const *p; /* *p est constant */
    int * const p; /* p est constant */
    int const **p; /* **p est constant */
    int const * const *p; /* *p et **p sont constants */
    Et d'autre part, "const T" est équivalent "T const", d'où il découle que l'écriture classique "const int *p" est équivalent à "int const *p" décrit plus haut.

  19. #19
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    const agit sur le type de données et sur l'élément à sa gauche, sauf exception quand il est en premier et agit à sa droite
    cf mon premier message plus haut
    et sachant ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // les 2 déclarations sont équivalentes
    const int constint;
    int const intconst;
    int myint const; // n'a absolument aucun sens
    int const* constintptr;
    // les 2 déclarations sont équivalentes
    int const* const constintconstptr;
    const int* const constintptrconst;
    en C le seul intérêt est pour const int/float/... * puisque de toutes façons tous les passages en paramètres se font par copie.
    passer un int ou un const int n'a aucune incidence.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  20. #20
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par MicBeastKiller Voir le message
    Alors certains points de ceci ne sont pas corrects ?
    http://www.developpez.net/forums/d12...r/#post6683664
    Comme je l'avais dit dans un message que tu as toi-même cité :
    Faudra juste vérifier les corrections apportées dans l'avant-dernier message
    D'ailleurs, j'ai relancé le sujet en question.

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