С загадкой ... Как я могу передать переменные аргументы в макрос? - PullRequest
5 голосов
/ 27 августа 2011

Я застрял здесь ...

#include <stdio.h>

#define DBG_LVL(lvl, stmt) \
do{ \
    if(lvl>1)  printf stmt; \
}while(0)

#define DBG_INFO(stmt)   DBG_LVL(1, stmt)
#define DBG_ERROR(stmt)  DBG_LVL(2, stmt)


int main()
{
    DBG_INFO(("hello, %s!\n", "world"));
    DBG_ERROR(("crazy, %s!\n", "world"));
    return 0;
}

Как видите, в приведенном выше коде для управления уровнем отладочной информации используются макросы типа "DBG_INFO" или "DBG_ERROR".

Теперьпо какой-то причине я должен заменить DBG_LVL() новой функцией.

void myprint(int lvl, const char * format, ...);

Единственное отличие состоит в том, что уровень отладки принимается в качестве первого параметра.Я думал:

#define DBG_LVL(lvl, stmt) myprint(lvl, stmt)

Конечно, это не удалось, потому что выражение "stmt" включает круглые скобки вокруг .Потом я погуглил, пытаясь найти способ убрать скобки, кажется, ничто не могло помочь.Я также попробовал некоторые приемы для передачи параметров в "stmt", но все равно не получилось ...: (

Можете ли вы мне помочь?

Ответы [ 2 ]

10 голосов
/ 27 августа 2011
# define EXPAND_ARGS(...) __VA_ARGS__
# define DBG_LVL(lvl, stmt) myprint(lvl, EXPAND_ARGS stmt);
2 голосов
/ 27 августа 2011

Не пишите это как макрос.

Напишите вместо обычной функции varargs:

void DBG_LVL(int level, char *fmt, ...)
{
    if (level < 1) return;

    va_list args;
    va_start(args, fmt);

    vaprintf(fmt, args);

    va_end(args);
}

Для myprint() также определите аналогичный vamyprint(int lvl, const char *format, va_list ap) и отправьте таким же образом.

...