Как получить имя вызывающей функции в C с многоточием в объявлении функции? - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь узнать в функции имя вызывающего абонента.

Если вы посмотрите на следующую ссылку, она не дублируется, потому что я добавил разницу: использование многоточия в объявлении функции.

Я пытался сделать, начиная с этого решения Как мы можем узнать имя функции вызывающей стороны? , чтобы сделать это, но я не могу найти решение.

Это работает для меня:

void a(int deb, char *str)
{
    printf("%s\n", str);
}

void a_special(int deb, char const * caller_name, char *str)
{
    printf( "[%d] blablabla [%s] ", deb, caller_name);
    a(deb, str);
}

#define a(deb, str) a_special(deb, __func__, str)

int main()
{
    a(1, "my log");
    return 0;
}

Но когда я добавляю многоточие (я говорю: "...") Я не знаю, как этого достичь с помощью макроопределения. Возможно ли в стандарте-C?

void a(int deb, char *str, ...) 
{
    va_list args;
    va_start(args,str);
    vprintf(str,args);
    va_end(args);
}

void a_special(int deb, char const * caller_name, char *str, ...) 
{
    printf( "[%d] blablabla [%s] ", deb, caller_name);
    a(deb, str, ...); 
}

#define a(deb, str) a_special(deb, __func__, str)

int main()
{
    a(1, "mylog %d %s", 1, "param2");
    return 0; 
}

Я также пытался получить его, используя обратную трассировку с -rdynamic, но безуспешно, но в любом случае я бы предпочел знать, как включить многоточие (3 точки) в макрос. Заранее спасибо!

1 Ответ

0 голосов
/ 09 января 2019

Если все, что вы просите, это как перенаправить эллипсы в макрос, а затем из макроса в функцию, тогда должно быть достаточно следующего:

По сути, вы передаете макрос также эллипсы ..., а внутри макроса вы можете использовать __VA_ARGS__.

void a(int deb, char *str, ...)
{
    va_list args;
    va_start(args,str);
    vprintf(str,args);
    va_end(args);
}

void a_special(int deb, char const * caller_name, char *str, ...)
{
    printf( "[%d] blablabla [%s] ", deb, caller_name);
    a(deb, str);
}

#define a(deb, str, ...) a_special(deb, __func__, str, __VA_ARGS__)

int main()
{
    a(1, "mylog %d %s", 1, "param2");
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...