Я хочу создать несколько протоколирования, и я создал класс. Однако у меня есть проблема с передачей ему аргументов.Почему va_start терпит неудачу?
Класс:
namespace debug
{
class log
{
private: // Members
const std::string context;
int Type;
public: // Methods
void message(int Type, const std::string& message, ...);
public: // Constructor, Destructor
log(const std::string& context, int Type);
~log();
};//class log
}//namespace debug
namespace debug
{
void log::message(int Type, const std::string& message, ...)
{
va_list args;
int len;
char *buffer;
va_start(args, message);
len = _vscprintf(message.c_str(), args) + 1; // _vscprintf doesn't count terminating '\0'
buffer = (char*)malloc(len * sizeof(char));
vsprintf_s(buffer, len, message.c_str(), args);
va_end(args);
}//log::message
}//namespace debug
У меня есть два макроса определены:
#define DEBUG_METHOD(Type) debug::log _debugLog(__FUNCTION__, Type);
#define DEBUG_MESSAGE(Type, debug_message, ...) { _debugLog.message(Type, debug_message, ##__VA_ARGS__); }
и я использую их в функции, как это:
BOOL test(BOOL *bTestVal)
{
DEBUG_METHOD(INFO);
DEBUG_MESSAGE(INFO, "Argument1 = '%s'", BoolToString((BOOL)*bTestVal));
//here comes some work...
}
К сожалению, я всегда получаю сообщение об ошибке. Эта строка len = _vscprintf(message.c_str(), args) + 1;
всегда выдает ошибку. Я думаю, va_start
вызывает это, потому что args
имеет значение + args 0x0052eed8 "ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ... char *
Может кто-нибудь, пожалуйста, помогите мне, что я делаю неправильно?
Заранее благодарен!
Что возвращает ваш BoolToString()? И вы уверены, что ваш компилятор поддерживает конструкцию '## __ VA_ARGS__'? – nos
Это BoolToString: 'char * const BoolToString (BOOL b) { \t return b? «Правда»: «Неверно»; } // BoolToString' – kampi
@nos: нет, я не уверен. Я до сих пор не использовал этот вид макроса. Я использую Visual Studio 2013 Express. – kampi