У меня есть следующий (упрощенный для примера) код, и он работает:
void log(const string type, const string msg, va_list argp)
{
fprintf(stdout, "[%s] ", type.c_str());
vfprintf(stdout, msg.c_str(), argp);
}
void log_err(const string msg, ...)
{
va_list argp;
va_start(argp, msg);
log("ERROR", msg, argp);
va_end(argp);
}
Я бы использовал его следующим образом:
log_err("test: %d", 5);
Однако, если бы я хотелчтобы переместить это в класс:
class Logger {
public:
Logger() {
//
};
void generic(const string type, const string msg, va_list argp) {
fprintf(stdout, "[%s] ", type.c_str());
vfprintf(stdout, msg.c_str(), argp);
};
void error(const string msg, ...) {
va_list argp;
va_start(argp, msg);
this->generic("ERROR", msg, argp);
va_end(argp);
};
};
Тогда я получил ошибку сегментации.Я знаю, что такие хитрые вещи, как макросы va, не могут работать в пределах классов, но я хочу знать, почему.
Спасибо за совет!
РЕДАКТИРОВАТЬ
Пример использования:
Logger logger;
logger.error("test", 5);
Полный источник:
#include <string>
#include <cstdlib>
#include <cstdarg>
using namespace std;
void log(const string type, const string msg, va_list argp)
{
fprintf(stdout, "[%s] ", type.c_str());
vfprintf(stdout, msg.c_str(), argp);
}
void log_err(const string msg, ...)
{
va_list argp;
va_start(argp, msg);
log("ERROR", msg, argp);
va_end(argp);
}
class Logger {
public:
Logger() {
//
};
void generic(const string type, const string msg, va_list argp) {
fprintf(stdout, "[%s] ", type.c_str());
vfprintf(stdout, msg.c_str(), argp);
};
void error(const string msg, ...) {
va_list argp;
va_start(argp, msg);
this->generic("ERROR", msg, argp);
va_end(argp);
};
};
int main()
{
//log_err("test: %s\n", "str");
Logger logger;
logger.error("test %s", 5);
return 0;
}
Я не хочу делать эти методы статичными, потому что при первоначальном использовании у меня есть дескрипторы личных файлов, в которые я пишу журналсообщения;