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 :

Fonctions parametres variables imbriquees


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut Fonctions parametres variables imbriquees
    Bonjour,

    Une petite question pour savoir s'il était possible d'imbriquer plusieurs fonctions a paramètres variables en propageant directement le ellipse, exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void test(char Niv,const char *str,...);
    void soustest(char Niv,const char *str,...);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void test(char aNiv,const char *aStr,...)
    {
       soustest(aNiv,aStr,...);
    }
    Mon but est d'utiliser une macro imbriquant une fonction "test" a parametres variables, afin de pouvoir activer/desactiver test avec un simple ifdef sur la macro et ainsi ne pas charger le code d'ifdef else...:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #ifdef DBG_TEST
    #define O_DEBUG_TEST(__NIV,const __STR,...) \
            test(__NIV, __STR, ...);                                      
    #else
    ...
    J'ai regardé dans plusieurs bouquins mais le sujet s'arrete juste a l'utilisation de fonctions a param variables.
    Et a l'origine je voulais faire quelque chose de simple et ne pas recoder tout le traitement des parametre (deja fait dans "test").

    Merci d'avance

  2. #2
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Oui, c'est tout à fait possible, il suffit d'utiliser <stdarg.h>.
    Ca donnerait un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdarg.h>
     
    void test(char aNiv, const char * aStr, ...) {
      va_list ap;
     
      va_start(ap, aStr);
      soustest(aNiv, aStr, ap);
      va_end(ap);
    }
    Plus tu pédales moins fort, moins t'avances plus vite.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut
    Merci je pensais a cette solution.
    Maintenant voulant utiliser une macro encapsulant soustest,
    Je rencontre un probleme de parametre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #define O_DEBUG_TEST(__NIV, __STR, ...) \
              {                                                     \
                 va_list ptrparam;                                  \
                 va_start(ptrparam,__STR);                            \
                 soustest(__NIV,__STR,ptrparam);                          \
                 va_end(ptrparam);                                  \
              }
    et le ellipse genere une erreur,
    Je pense que cela n'est tout simplement pas realisable avec les macros,
    Néanmoins si il y a une possibilité je suis preneur,

    En tout cas merci Pouet_forever

  4. #4
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Pour le préprocesseur, tu fais ça différemment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define O_DEBUG_TEST(__NIV, __STR, ...)   \
        soustest(__NIV, __STR, __VA_ARGS__);
    Si tu utilises VS avec une version antérieure à 2005 ça ne fonctionnera pas.
    Plus tu pédales moins fort, moins t'avances plus vite.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut
    Si tu utilises VS avec une version antérieure à 2005 ça ne fonctionnera pas.
    Oui c'est justement mon probleme...
    Du coup je vais utiliser les doubles parentheses (cf lien)

    Merci de ton aide !

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

Discussions similaires

  1. Problemes avec une fonction a parametres variables
    Par karim&thomas dans le forum C++
    Réponses: 3
    Dernier message: 15/05/2008, 13h43
  2. Réponses: 9
    Dernier message: 15/05/2007, 13h41
  3. Fonction avec parametre variable
    Par Linaa dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/12/2006, 13h41
  4. Fonction Execlp avec nombre parametres variable
    Par laurent_ifips dans le forum C
    Réponses: 3
    Dernier message: 25/11/2005, 21h14
  5. Réponses: 9
    Dernier message: 22/07/2005, 17h10

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