Я хочу отслеживать журналы, используя макропараметр с несколькими параметрами, всегда равными нулю.проблема с ++ windows - PullRequest
3 голосов
/ 12 июня 2010

Я использую следующий способ для отслеживания времени функции:

#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 - это саморазрушитель, который будет самостоятельно присваивать время жизни и печатать szMessageBuffer.Однако, когда я использую макрос, это:

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

Всегда генерируется сообщение hello -> (null)

Может ли кто-нибудь помочь?Большое спасибо!

Ответы [ 3 ]

3 голосов
/ 12 июня 2010

Правильная версия:

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

__VA_ARGS__ не типа va_list, а аргументы, разделенные запятыми, поэтому вам нужно использовать sprintf_s, а не vsprintf_s.

2 голосов
/ 12 июня 2010

Другой подход к ведению журнала заключается в использовании потоков:

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

Затем вы можете сказать что-то вроде:

LOG( "the value of x is " << x << " and of y is " << y );
1 голос
/ 12 июня 2010

Макросы не являются переменными функциями, вам не нужно обрабатывать список аргументов с помощью va_* функций. Макросы просто преобразуют текст исходного кода.

С учетом сказанного ваш компилятор (я полагаю, MSVC) поддерживает переменные макросы с __VA_ARGS__:

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