代码之家  ›  专栏  ›  技术社区  ›  Alejandro Galera

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

c
  •  7
  • Alejandro Galera  · 技术社区  · 7 年前

    我试图在函数中知道它的调用方名称。

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

    我已经试过了,从这个解决方案开始 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 回复  |  直到 7 年前
        1
  •  6
  •   Duck Dodgers    7 年前

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

    ... 在宏中,您可以使用 __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;
    }