2010-06-12 6 views
3

J'utilise la manière suivante pour le temps de cout fonction:Je veux tracer des journaux en utilisant un paramètre multi-macro toujours nul. problème C++ windows

#define TIME_COST(message, ...)\ 
char szMessageBuffer[2048] = {0};\ 
va_list ArgList;\ 
va_start(ArgList, message);\ 
vsprintf_s(szMessageBuffer, 2048, message, ArgList);\ 
va_end(ArgList); \ 
string strMessage(szMessageBuffer);\ 
CQLogTimer t(strMessage); 

// CQLogTimer est une auto destructor, qui durée de vie cout de son propre et imprimer szMessageBuffer. Cependant quand j'utilise la macro ceci:

void fun 
{ 
TIME_COST("hello->%s", filePath); 
XXXXXX 
} 

Le message généré est toujours bonjour -> (null)

Quelqu'un peut-il aider? Merci beaucoup!

+0

Pourquoi utilisez-vous une macro (et pourquoi utilisez des arguments variables vous)? Il y a certainement des façons plus sûres de faire de l'exploitation forestière. – sbi

+0

parce que je veux le nettoyer en mode de libération totalement. – sxingfeng

Répondre

3

La version correcte est:

#define TIME_COST(message, ...)\ 
char szMessageBuffer[2048] = {0};\ 
sprintf_s(szMessageBuffer, 2048, message, __VA_ARGS__);\ 
string strMessage(szMessageBuffer);\ 
CQLogTimer t(strMessage); 

__VA_ARGS__ n'est pas le type va_list, mais séparés par des virgules arguments, donc vous devez utiliser sprintf_s, pas vsprintf_s.

1

Les macros ne sont pas des fonctions variées, vous n'avez pas besoin de traiter la liste d'arguments avec les fonctions va_*. Les macros ne font que transformer le texte du code source.

Cela dit, votre compilateur (MSVC je suppose) prend en charge les macros variadique avec __VA_ARGS__:

#define TIME_COST(fmt, ...)\ 
char szMessageBuffer[2048] = {0};\ 
sprintf_s(szMessageBuffer, 2048, fmt, __VA_ARGS__);\ 
string strMessage(szMessageBuffer);\ 
CQLogTimer t(strMessage); 
+1

En supposant TIME_COST ("hello ->% s", filePath) appel, votre code ne compile pas - erreur C2664: 'int vswprintf_s (wchar_t *, taille_t, const wchar_t *, va_list)': impossible de convertir le paramètre 4 de ' 'à' va_list ' –

+0

@AOI Karasu, ouais, raté celui-là. –

2

Une approche différente de l'exploitation forestière est d'utiliser les flux:

#define LOG(msg)  \ 
    {     \ 
    ostringstream os; \ 
    os << msg;  \ 
    CDLogTimer(os.str()); \ 
    } 

Vous pouvez dire des choses comme:

LOG("the value of x is " << x << " and of y is " << y); 
+1

Je n'ai jamais aimé cette syntaxe de style flux et je ne sais pas pourquoi. Néanmoins votre version a l'air plus soignée que celle avec sprintf_s. –