首页 > 解决方案 > 如何在函数声明中使用省略号在 C 中获取调用者函数名称?

问题描述

我试图在一个函数中知道它的调用者姓名。

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

我已经尝试过,从这个解决方案开始我们如何知道调用者函数的名称?这样做,但我无法得到解决方案。

这对我有用:

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 个点)。提前致谢!

标签: c

解决方案


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

基本上,您还将宏传递给省略号...,并在宏内部使用__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;
}

推荐阅读