2014-10-30 4 views
1

меня печатают доступное что-то вроде этого#define с переменными аргументами для отладки

PrintMe(("abc %d",a)); 

PrintMe определена как этого

#define Printme(_X_) printf _X_ 

Но теперь мне нужно сопоставить его с какой-то печатью, которая принимает переменные аргументы что-то подобные

#define Printme(format , args ....) PrintVar(30,format,##args) 

Printvar имеет одинарные круглые скобки, а Printme имеет двойные круглые скобки

Как отобразить эту

+0

Есть ли причина, что вы используете макросы препроцессора вместо нормальной функции? – ipavl

+0

Подробнее об определении макросов отладки см. В http://stackoverflow.com/questions/1644868/c-define-macro-for-debug-printing. –

ответ

1

Вы можете сделать это:

#define Printme(format, ...) PrintVar(30, format, ##__VA_ARGS__) 

Документация (для НКУ): https://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

+0

Но Printme имеет формат, такой как Printme ((«abc»)); Printvar как PrintVar (30, «abc») с его устаревшим кодом i can not change format of Printme – Gajukorse

+0

@Gajanana: Хорошо, я обновил свой ответ, чтобы использовать специальный '##' перед '__VA_ARGS__', что делает его работайте в случае, когда у вас есть строка формата и никаких дополнительных аргументов. –

+0

Проблема заключается в том, что печатная версия содержит скобки и PrintVar. Поэтому его не работает - – Gajukorse

0

Как насчет:

#define PRINTME2(fmt, ...) printvar(30, fmt, ##__VA_ARGS__) 
#define PRINTME(_X_) PRINTME2 _X_ 

полный пример:

#include <stdio.h> 
#include <stdarg.h> 

void printvar(int lvl, char * fmt, ...) 
{ 
    printf("lvl %d:", lvl);                   
    va_list argptr; 
    va_start(argptr,fmt); 
    vprintf(fmt, argptr); 
    va_end(argptr); 
} 

#define PRINTME2(fmt, ...) printvar(30, fmt, ##__VA_ARGS__) 
#define PRINTME(_X_) PRINTME2 _X_ 

int main(void) 
{ 
    PRINTME(("I have %u apples\n", 3)); 
    return 0; 
} 

Выход:

лвл 30: У меня есть 3 яблока

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