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 :

#define un peu particulier


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 24
    Par défaut #define un peu particulier
    Salut,

    J'aimerai faire une macrodéfinition d'une fonction prenant un nombre variable d'éléments.
    Un peu comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define my_sprintf(...)   sprintf(...)
    Seulement cette syntaxe n'est apparement pas correct.
    Savez vous comment faire?

  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 Re: #define un peu particulier
    Citation Envoyé par greuh
    Salut,

    J'aimerai faire une macrodéfinition d'une fonction prenant un nombre variable d'éléments.
    Un peu comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define my_sprintf(...)   sprintf(...)
    Seulement cette syntaxe n'est apparement pas correct.
    Savez vous comment faire?
    La méthode portable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define my_sprintf(a) printf a
    Ca s'utilise comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my_sprintf (("%s\n", "Hello world"));

  3. #3
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 24
    Par défaut
    Euh... ???
    Tu voulais pas dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define my_sprintf(a) a
    my_sprintf (sprintf("%s\n", "Hello world"));
    Si c'est ca, je n'y avais pas pensé et ca fonctionne, mais on perd un peu l'intéret du define.
    Ou alors j'ai pas compris...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 277
    Par défaut
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define my_sprintf sprintf
    ça marche pas ?

  5. #5
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 24
    Par défaut
    Citation Envoyé par Le Furet
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define my_sprintf sprintf
    ça marche pas ?
    Si, en fait j'ai mal posé ma question...

    Ce que je veux faire resemble à ca (en entier):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #if CONDITION
    #define my_sprintf(...)  sprintf(...)
    #else
    #define my_sprintf(...)  0
    #endif
    Et dans mon .c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int n;
    n = my_sprintf(buffer, "coucou %s\n", ptr);

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 277
    Par défaut
    Et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #if CONDITION
    #define my_sprintf(a)  sprintf(a)
    #else
    #define my_sprintf(a)  0
    #endif
    Avec la syntaxe d'Emmanuel :

    my_sprintf(("blabla")) ;

  7. #7
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 24
    Par défaut
    Citation Envoyé par Le Furet
    Et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #if CONDITION
    #define my_sprintf(a)  sprintf(a)
    #else
    #define my_sprintf(a)  0
    #endif
    Avec la syntaxe d'Emmanuel :

    my_sprintf(("blabla")) ;
    Je ne dois pas bien comprendre la syntaxe d'Emmanuel, la fonction sprintf n'apparait nulle part... comme cela peut il fonctionner?

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    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 391
    Par défaut
    Seulement, ça ne marche pas partout:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define my_sprintf(a)	sprintf(a)
    void testDefine()
    {
    char chn[10];
    my_sprintf(chn, "%d", -3);
    }
    donne ceci sous Visual:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    warning C4002: too many actual parameters for macro 'my_sprintf'
    error C2660: 'sprintf' : function does not take 1 parameters
    Et sous gcc 3.4.2 (Dev-Cpp):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "my_sprintf" passed 3 arguments, but takes just 1
    `my_sprintf' undeclared (first use this function)
    En fait, ça ne marche nulle part...
    Il y a bien une extension GNU qui permet des macros à nombre de paramètres variables, mais... c'est une extension GNU.
    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
    Membre émérite
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Par défaut
    Meuh si, ça fonctionne très bien... Manu a juste ``oublié'' un detail.... ;-)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define my_sprintf(a) sprintf a
    qui s'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my_sprintf(("....."));
    pas de parenthèe dans le define
    double parenthèsage à l'utilisation
    ;-)
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    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 391
    Par défaut
    Je viens de tester sous Visual et sous Dev-c++, ça a l'air de marcher sur les deux.
    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.

  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 greuh
    Euh... ???
    Tu voulais pas dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define my_sprintf(a) a
    my_sprintf (sprintf("%s\n", "Hello world"));
    Non, mais j'ai corrigé mon code.

  12. #12
    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 Pouic
    Meuh si, ça fonctionne très bien... Manu a juste ``oublié'' un detail.... ;-)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define my_sprintf(a) sprintf a
    qui s'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my_sprintf(("....."));
    Oui, je suis coutumier du fait. Il faut dire que chez moi, ce code est en bibliothèque depuis 10 ans et que jeme contente de l'utiliser...

    http://emmanuel-delahaye.developpez....b/ed/inc/sys.h

  13. #13
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 24
    Par défaut
    Super, ca marche
    Merci beaucoup!

    Du coup j'ai un collègue qui veut faire un truc encore un peu plus tordu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int x;
    #define  my_func_A(a, b, c, ...)   my_func_B(x, a, b, c, ...)
    Vous savez faire ca aussi?

  14. #14
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,
    la question à déjà été posée sur le forum C :
    Macros et nombre d'arguments variable
    Nombre d'arguments variable

    En C99, il est possible de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)

  15. #15
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 24
    Par défaut
    Terrible, ca fonctionne
    Merci

    PS: désolé, j'avais pas vu l'ancien post...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/08/2006, 01h39
  2. [XSLT]Tableau un peu particulier
    Par JohnBlatt dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 21/06/2006, 18h14
  3. Un tri un peu particulier
    Par GregPeck dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/06/2006, 15h32
  4. Menu un peu particulier avec des onmouseover
    Par Jinroh77 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 21/02/2006, 14h30
  5. Réponses: 2
    Dernier message: 05/01/2004, 11h23

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