регистратор в стиле printf, который не является вариативным - PullRequest
1 голос
/ 11 августа 2011

Наш проект на C / C ++ использует новый внутренний скрипт, который свободно оборачивает каждую функцию в SWIG, чтобы сделать ее доступной для скриптов python. Он заглушает нашу функцию регистрации, поскольку SWIG не может хорошо оборачивать переменные функции.

Поэтому я решил спрятать функции макроса в макросе, который SWIG никогда не отключит, как показано в упрощенном примере ниже:

#include <iostream>

void LogPrint(char *file, int line, char* msg)
{
    std::cout << file << ":" << line;
    std::cout << " [ " << msg << " ] ";
    std::cout << std::endl;
}

#define MAX_LOG 256

#define LogPrintf(msg, args...) \
{ \
    char *msg_buffer = new char[MAX_LOG]; \
    snprintf(msg_buffer, MAX_LOG, msg, ##args); \
    Log(__FILE__, __LINE__, msg_buffer); \
    delete [] msg_buffer; \
}

main()
{
    LogPrintf("%s = %f", "tau", 6.28318);
    LogPrintf("%s = %f", "pi", 3.14159);
}

Это хорошо? Есть ли лучшие решения этой проблемы? Спасибо.

1 Ответ

1 голос
/ 11 августа 2011

Python упрощает сборку отформатированных строк в Python, поэтому я бы просто предложил простую ошибку «дай мне строку и я ее записываю».

Однако в общем случае вы могли бы рассмотреть следующее:

1) boost :: format

2) эмулировать интерфейс iostream, создав класс, содержащий член std::stringstream, перегружая operator<< для пересылки в operator<< в потоке строки, изатем добавление другого способа фактически регистрировать содержимое «буфера» (один из подходов состоит в том, чтобы войти в деструктор объекта - сделать его не подлежащим копированию, вероятно, хорошая идея), так что вы можете сделать что-то вроде Logger() << "foo" << bar; - временный объектвремя жизни продлевается до конца строки, оператор перегрузки создает содержимое буфера, а затем dtor запускает и выводит .str() потока строк в любое место).

...