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 :

mot-clé : static


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 54
    Points : 25
    Points
    25
    Par défaut mot-clé : static
    bonjour,

    J'ai vu dans une librairie des fonctions déclarées avec le mot
    clé static.
    Quel est l'intérêt, mais d'abord le sens, d'une fonction static INDéPENDANTE(j'entends qui n'est pas une fonction membre d'une classe) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    static returnType uneFonction(...)
    {
        // instructions
    }
    Merci

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par mangeclous Voir le message
    bonjour,

    J'ai vu dans une librairie des fonctions déclarées avec le mot
    clé static.
    Quel est l'intérêt, mais d'abord le sens, d'une fonction static INDéPENDANTE(j'entends qui n'est pas une fonction membre d'une classe) ?

    static returnType uneFonction(...)
    {
    // instructions
    }

    Merci
    Cette utilisation du mot clé static limite la visibilité de la fonction à l'unité de compilation (i.e. pour faire simple le fichier source) courant. Cette fonction n'est donc pas appelable depuis une fonction située dans un autre fichier source.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 54
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par gl Voir le message
    Cette utilisation du mot clé static limite la visibilité de la fonction à l'unité de compilation (i.e. pour faire simple le fichier source) courant. Cette fonction n'est donc pas appelable depuis une fonction située dans un autre fichier source.
    Donc cela limite son utilisation seulement, aucune amélioration de performance ou autre ?

    Edit:
    En fait je ne suis plus sûr d'avoir compris, j'ai l'exemple d'un projet où
    une fonction static indépendante(pour reprendre mon vocabulaire ci-dessus)
    qui est appelée dans un autre fichier source(et ça compile bien sûr).

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par mangeclous Voir le message
    En fait je ne suis plus sûr d'avoir compris, j'ai l'exemple d'un projet où
    une fonction static indépendante(pour reprendre mon vocabulaire ci-dessus)
    qui est appelée dans un autre fichier source(et ça compile bien sûr).
    Montres le code concerné.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 54
    Points : 25
    Points
    25
    Par défaut
    je fais un stage dans une entreprise, je ne peux pas filer le code...

    mais l'idée c'est dans un fichier toto.h, j'ai une fonction déclarée static et inline
    static inline typeRetour laFonction(...){...}

    elle est utilisé dans un autre fichier source machin.cpp
    mais le toto.h est included bien sûr.
    Si je lis tes explications et celles de msdn
    http://msdn.microsoft.com/en-us/library/s1sb61xd.aspx
    je ne comprends pas le sens de "static" dans ce cas.

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    le mot clé "inline" sert à indiquer au compilateur que le code de la fonction doit être copié dans le code de l'appelant, il ne doit pas essayer de faire un "call fonction" mais il copie/colle le code. Cela permet d'optimiser le temps d'exécution puisqu'il n'y a plus la sequence call/ret. inline ne devrait être utilisé que pour des toutes petites fonctions (1 seule ligne de code dans la fonction) sinon, cela n'a pas trop de sens et le gain n'est plus intéressant.

    Le mot clé static a 2 rôles en C++.
    Tout d'abord, en C comme en C++, il permet de définir une fonction dont la visibilité naturelle est limitée au module courant (le .c dans lequelle elle est déclarée). Ainsi, si la fonction mon_print() est déclarée static dans le fichier toto.c, elle ne pourra être appelée que par une des fonctions du fichier toto.tc. Elle ne pourra pas être appelée par la fonction main() dans le fichier main.c par exemple, le linker va émettre une erreur.

    Si j'ai parlé de visibilité "naturelle", c'est qu'il est possible par des moyen détournés (pointeur de fonctions) de "violer" cette contrainte, mais ceci est une autre histoire.

    Le 2 eme rôle est uniquement valable en C++. Il permet de définir une fonction membre de classe qui peut s'exécuter sans instanciation de la classe. En effet, les fonction static membres de classe ne possède pas de paramètre "this".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class exemple
    {
    public:
       inline exemple(void) { nb_instance++; }
       inline ~exemple(void) { nb_instance--; }
     
       inline static int GetNbInstance(void) { return m_nb_instance; }
     
    private:
       static int m_nb_instance;
    };
    Cette classe pourra être utilisée de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void main(void)
    {
       printf("Il y a %d instances actives de la classe exemple\n", exemple::GetNbInstance());
     
       // crée 10 instances de la classe exemple
    exemple * tableau = new exemple[10];
     
       printf("Il y a %d instances actives de la classe exemple\n", exemple::GetNbInstance());
    }
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par mangeclous Voir le message
    mais l'idée c'est dans un fichier toto.h, j'ai une fonction déclarée static et inline
    static inline typeRetour laFonction(...){...}

    elle est utilisé dans un autre fichier source machin.cpp
    mais le toto.h est included bien sûr.
    C'est bien le cas que j'explique plus haut.

    Ta fonction est définie dans un header. Elle est donc visible dans tous les fichiers sources qui incluent cet header (directement ou via d'autre header). L'inclusion ne fait que copier le contenu d'un fichier dans un autre avant la compilation.

    Tu utilises donc bel et bien la fonction dans l'unité de compilation [1] dans lequel elle est définie.



    [1] L'explication que j'ai donnée sur l'unité de compilation dans mon précédent message est effectivement floue. Je ne me souviens plus de la définition précise mais elle comprends le fichier source ainsi que les fichiers inclus par celui-ci

  8. #8
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 54
    Points : 25
    Points
    25
    Par défaut
    @ram-0000:
    en fait j'aurai du enlever le "inline" c'est venu un peu en plus du static qui était le fond de mon problème.
    J'ai cru comprendre que quand on met inline, en fait c'est le compilo qui optimise si il faut vraiment mettre la fonction inline ou pas.

    @both:
    Maintenant je pense avoir cerné la notion mais je ne vois toujours pas l'intérêt en fait. Si j'inclus le header j'aurai accès à la fonction ailleurs, comme d'hab quoi. C'est pour empêcher de l'appeler dans une autre librairie, en utilisant extern?

  9. #9
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Déclarer une fonction « static » dans un fichier d'en-tête a en effet un intérêt très limité.
    En revanche, le faire dans un fichier d'implémentation, c'est beaucoup plus utile.

    C'est d'ailleurs ce que pointent du doigt gl et ram-0000, si l'on fait attention…
    Citation Envoyé par ram-0000 Voir le message
    Le mot clé static a 2 rôles en C++.
    Tout d'abord, en C comme en C++, il permet de définir une fonction dont la visibilité naturelle est limitée au module courant (le .c dans lequelle elle est déclarée). Ainsi, si la fonction mon_print() est déclarée static dans le fichier toto.c, elle ne pourra être appelée que par une des fonctions du fichier toto.tc. Elle ne pourra pas être appelée par la fonction main() dans le fichier main.c par exemple, le linker va émettre une erreur.
    Il faut juste faire abstraction de la faute de frappe : le fichier « toto.tc » n'est pas censé exister dans cette explication.

  10. #10
    En attente de confirmation mail
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2010
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 501
    Points : 1 060
    Points
    1 060
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    Déclarer une fonction « static » dans un fichier d'en-tête a en effet un intérêt très limité.
    D'un autre côté, dans ce cas, si la fonction n'est pas static, le link plantera car la même méthode sera présente dans chaque unité de compilation qui inclue le header.

  11. #11
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Nudger Voir le message
    D'un autre côté, dans ce cas, si la fonction n'est pas static, le link plantera car la même méthode sera présente dans chaque unité de compilation qui inclue le header.
    Sauf si la fonction est inline.

  12. #12
    Membre habitué Avatar de nowahn
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 84
    Points : 150
    Points
    150
    Par défaut
    Bonjour,

    Vous oubliez une troisième utilisation du mot clé static, la déclaration d’une variable statique dans une fonction (j’explique pas ce que c’est, je pense que vous savez, sinon, voir la FAQ C).

    Une chose qui se passe quand une fonction est déclarée static dans un en-tête, c’est que chaque fichier source dans lequel l’en-tête est inclus possède sa propre fonction, qui porte certe le même nom que celle des autres fichiers sources, mais qui est bien une autre fonction.
    Pour s’en convaincre, il suffit de mettre une donnée statique dans ces fonctions :
    Fichier EnTete.hpp :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #ifndef _ENTETE_HPP_
    #define _ENTETE_HPP_
     
    static int StaticFunction();
     
    int CallOtherStaticFunction(); // Cette fonction n’est pas statique.
     
    #endif
    Fichier Second.cpp :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include "EnTete.hpp"
     
    int StaticFunction() // Version utilisée uniquement dans ce fichier source.
    {
       static int StaticData(0);
       return ++StaticData;
    }
     
    int CallOtherStaticFunction()
    {
       return StaticFunction(); // Utilise celle de ce fichier source.
    }
    Fichier Main.cpp :
    Code C++ : 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
    #include "EnTete.hpp"
    #include <iostream>
     
    int StaticFunction() // Version utilisée uniquement dans ce fichier source.
    {
       static int StaticData(0);
       return ++StaticData;
    }
     
    int main()
    {
       std::cout << StaticFunction() << '\n'; // Affiche 1
       std::cout << StaticFunction() << '\n'; // Affiche 2
       std::cout << StaticFunction() << '\n'; // Affiche 3
       std::cout << CallOtherStaticFunction() << '\n'; // Affiche 1
       std::cout << StaticFunction() << '\n'; // Affiche 4
     
       return 0;
    }
    Ce programme affiche la sortie suivante :
    Ceci peut éventuellement être un comportement désiré.

    À propos, l’utilisation du mot clé static pour limiter la portée d’une fonction ou d’une donnée à un fichier source est dépréciée en C++, on préfère utiliser les espaces de noms anonymes. Voir la FAQ ici et .

  13. #13
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par nowahn Voir le message
    Une chose qui se passe quand une fonction est déclarée static dans un en-tête, c’est que chaque fichier source dans lequel l’en-tête est inclus possède sa propre fonction, qui porte certe le même nom que celle des autres fichiers sources, mais qui est bien une autre fonction.
    Pour s’en convaincre, il suffit de mettre une donnée statique dans ces fonctions :
    J'avais songé à le préciser avant de me demander si le compilateur n'était pas en droit de supprimer les doublons lorsque cela ne change pas le comportement (ce qui n'est donc pas le cas avec ton exemple).

    Ceci étant, quelque soit la manière dont s'est effectivement implémentée, la remarque est utile. Le code se comporte comme s'il y avait plusieurs fonctions différentes avec le même nom.

    Citation Envoyé par nowahn Voir le message
    À propos, l’utilisation du mot clé static pour limiter la portée d’une fonction ou d’une donnée à un fichier source est dépréciée en C++, on préfère utiliser les espaces de noms anonymes. Voir la FAQ ici et .
    +1.

    Mais il n'en reste pas moins qu'il est utile de comprendre le fonctionnement de static vu la quantité de code qui l'utilise (ce qui semble être le cas de la question initiale).

  14. #14
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 54
    Points : 25
    Points
    25
    Par défaut
    merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation du mot-clef "static"
    Par sir_gcc dans le forum Langage
    Réponses: 3
    Dernier message: 16/04/2007, 11h18
  2. mot clé static
    Par salseropom dans le forum C
    Réponses: 5
    Dernier message: 28/02/2007, 14h23
  3. Mot-clé static
    Par Zanton dans le forum Langage
    Réponses: 9
    Dernier message: 19/05/2006, 11h13
  4. Question sur l'utilisation du mot réservé static
    Par flash2590 dans le forum Langage
    Réponses: 4
    Dernier message: 10/04/2006, 00h20
  5. mot-clef static
    Par keil dans le forum C++
    Réponses: 8
    Dernier message: 25/01/2006, 17h11

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