1

Prenez une fonction comme printf qui accepte un nombre variable d'arguments, ce que je voudrais faire est de passer ce nombre variable de fonctions à une sous-fonction sans changer leur ordre. Un exemple de ceci serait aliasing la fonction printf à une fonction appelée console ...Transmettre un nombre variable d'arguments à une fonction d'alias

#include <stdio.h> 

void console(const char *_sFormat, ...); 

int main() { 
    console("Hello World!"); 
    return 0; 
} 

void console(const char *_sFormat, ...) { 
    printf("[APP] %s\n", _sFormat); 
} 

Si je l'ai fait par exemple console("Hello %s", sName), je voudrais que le nom soit transmis à la fonction printf aussi, mais il doit être capable de continuer à accepter un nombre varable d'arguments comme le fait déjà printf.

+0

Je suis en utilisant Visual C++ Express Edition 2008. –

+2

Vous voudrez probablement concaténer ' "[APP]"' et '_sFormat'. –

+1

@gf - oh oui, bon point! –

Répondre

4

Voici ce que vous voulez:

#include <stdio.h> 
#include <stdarg.h> 

void console(const char *_sFormat, ...); 

int main() { 
    console("Hello World!"); 
    return 0; 
} 

void console(const char *_sFormat, ...) { 
    va_list ap; 
    va_start(ap, _sFormat); 
    printf("[APP] "); 
    vprintf(_sFormat, ap); 
    printf("\n"); 
    va_end(ap); 
} 
+0

Vous obtenez un plus pour la compilation :). –

+1

Cela fonctionne aussi: essayez la console ("Hello% s", "World!"); ;-) –

+0

Je l'ai donné aussi à vous monsieur, bonne réponse, et cela fonctionne fantastiquement bien et je peux travailler avec elle pour d'autres fonctions. @Kornel Kisielewicz, vous avez été d'une grande aide. Merci pour votre réponse originale aussi et la main que vous avez tenue avec l'explication de ce que tout a fait. Très utile. –

2

Il y aura un autre problème (noté gf) - vous devriez probablement concaténer la chaîne dans printf et le paramètre _sFormat - Je doute que printf est récursive - d'où les déclarations de format dans le premier paramètre ne sera pas en lecture !

D'où peut-être une telle solution serait plus agréable:

#include <stdarg.h> 

void console(const char *_sFormat, ...) 
{ 
    char buffer[256]; 

    va_list args; 
    va_start (args, _sFormat); 
    vsprintf (buffer,_sFormat, args); 
    va_end (args); 

    printf("[APP] %s\n", buffer); 
} 

Types/fonctions utilisées:

+0

1>. \ File.cpp (43): erreur C2065: 'c': identificateur non déclaré 1>. \ File.cpp (43): erreur C3861: 'va_start': identificateur introuvable 1>. \ File. cpp (47): erreur C3861: 'va_end': identifiant non trouvé –

+1

@Mark, avez-vous oublié '#include '? –

+0

Apparemment, merci beaucoup pour cela. Toujours obtenir un identifiant non déclaré pour 'c' tho. (Merci de me tenir par la main.) –

Questions connexes