如何在函数声明中用省略号获取C中的调用者函数名称?

时间:2019-01-09 13:06:51

标签: c

我试图在函数中知道其调用者名称。

如果您查看下面的链接,由于我添加了一个区别:函数声明中的省略号用法,因此不会重复。

从此解决方案How can we know the caller function's name?开始,我尝试这样做,但是我无法找到解决方案。

这对我有用:

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的backtrace编译来获取它,但没有成功,但是无论如何,我还是想知道如何在宏中包含省略号(3个点)。 预先感谢!

1 个答案:

答案 0 :(得分:6)

如果您要提供的是如何将省略号转发到宏,然后再从宏转发到函数,那么以下内容就足够了。

基本上,您还向宏传递了椭圆...,并且可以在宏内使用__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;
}