2016-12-22 3 views
-1

Я пытаюсь переопределить макрос Variadic для использования cout вместо printf. Вот исходный код:Преобразовать __VA_ARGS__ в строку

#define LOGE(...) PRINT_LEVEL(1, __VA_ARGS__); 

    #define PRINT_LEVEL(level,...) do { \ 
     if (debug_components.DEBUG_COMPONENT >= level) \ 
      { printf("[%s]: ", levels_strings[level-1]); printf(__VA_ARGS__); printf("\n"); } \ 
    }while(0) 

я преобразовал это следующее использовать соиЬ вместо Printf:

#define PRINT_LEVEL(level,...) do { \ 
if (debug_components.DEBUG_COMPONENT >= level) \ 
{ std::string argString; sprintf(argString, __VA_ARGS__); std::cout << "[" << levels_strings[level-1] << "]" << argString << "\n";} \ 
    }while(0) 

По какой-то причине, __VA_ARGS__ отлично работает с Printf, но НЕ Sprintf. Он также не работает с cout. Я хотел бы знать правильный способ конвертировать __VA_ARGS__ в строку или, если это не так, правильный способ просто распечатать ее с помощью cout.

+1

Будьте осторожны, snprintf возьмите буфер для первого аргумента. – Hugal31

+0

Все еще не работает. См. Отредактированный код выше; теперь я получаю следующую ошибку: – user1765354

+0

Функция кандидата не жизнеспособна: неизвестно преобразование из 'std :: string' (aka 'basic_string ') в 'char * __ ограничивать' для 1-го аргумента extern int sprintf (char * __restrict __s, – user1765354

ответ

1

sprintf принимает дополнительный аргумент, буфер данных для записи вывода. Вы не можете поменять printf на sprintf без внесения изменений для предоставления этого буфера. Он также не возвращает указатель на строку, поэтому вы не можете назначить результат std::string и ожидать, что он будет работать. Если вы работаете небезопасным (при условии, максимальную длину буфера), как-то просто, как:

#define PRINT_LEVEL(level,...) do { \ 
    if (debug_components.DEBUG_COMPONENT >= level) \ 
    { 
     char buf[1024]; 
     sprintf(buf, __VA_ARGS__); std::cout << "[" << levels_strings[level-1] << "]" << buf << "\n";} \ 
}while(0) 

будет работать (и с усечением, может быть сделано с безопасностью, если не надежно с помощью snprintf), но если вы используя типы C++ в любом случае, вы можете посмотреть на a non-printf-y solution

+0

Ударьте меня в это ! Благодаря. – user1765354

1

Я использовал sprintf неправильно. Вот правильный код:

char argString[1024]; sprintf(argString, __VA_ARGS__); 

Теперь argString имеет значение va_args.

Смежные вопросы