c - 如何在函数声明中使用省略号在 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 个点)。提前致谢!
解决方案
如果您所要求的只是如何将省略号转发到宏,然后从宏转发到函数,那么以下内容就足够了。
基本上,您还将宏传递给省略号...
,并在宏内部使用__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;
}
推荐阅读
- javascript - 在 OpenLayers 地图中显示多边形
- swift - SwiftUI 中的 .primary 和 .secondary 颜色是什么?
- docker - 如何在内部实验室中使用 Rancher 负载均衡器
- angular - Angular 4 重写资产 url
- c# - 对象实例化是否必须在使用块表达式内部发生?
- python - Python ElementTree 解析并写入为原始格式
- java - UrlEncodedFormEntity 在 Apache HttpClient 4 中做了什么?
- python - Plotly:如何使用滑块调整直方图 bin 大小?
- html - 我怎样才能让这些单选按钮内联并排放置
- .net-core - 如何仅通过 Localhost 中的代码创建 Azure 函数并使用 Azure Active Directory 对其进行配置?