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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 54
    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 : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    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
    Membre averti
    Inscrit en
    Février 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 54
    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 : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    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
    Membre averti
    Inscrit en
    Février 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 54
    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 : 62
    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
    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 : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    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

+ 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