Загадка C… Как передать переменные аргументы в макрос?

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

#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", но все равно не удалось ...: (

Вы можете мне помочь?

5
задан Brian Tompsett - 汤莱恩 14 February 2016 в 14:41
поделиться