当前位置: 技术问答>linux和unix
俺需要实现这样的功能:一个宏放在return前,把本函数中的入参都记录下来,当然不希望调用者传入参数,谢谢
来源: 互联网 发布时间:2016-06-04
本文导语: 我有这样一个BT的想法: SYSTRACE(CHAR * szFmt,...) { 在这里面,把用户传入的变参,解析一下记录在szFmt里面。 } 不过需要调用者每一次自己写szFmt,并依次传入各个参数, 能否在C语言的层面上实现此功能函数,而...
我有这样一个BT的想法:
SYSTRACE(CHAR * szFmt,...)
{
在这里面,把用户传入的变参,解析一下记录在szFmt里面。
}
不过需要调用者每一次自己写szFmt,并依次传入各个参数,
能否在C语言的层面上实现此功能函数,而不要关系CPU,寄存器等硬件信息。
SYSTRACE(CHAR * szFmt,...)
{
在这里面,把用户传入的变参,解析一下记录在szFmt里面。
}
不过需要调用者每一次自己写szFmt,并依次传入各个参数,
能否在C语言的层面上实现此功能函数,而不要关系CPU,寄存器等硬件信息。
|
我觉得你自己的方案就可行(且具有可移植性) 只是每次都要自己写 格式字符串,以及把形参重新传入。
fetag的方案我觉得不好,
1. 要动用汇编 (当然你可以用C取第一个参数地址 然后根据入栈顺序 一个一个取 不过都不具可移植性)
2. 你总要有方法来实现知道取几个
3. 即使类似于char *之类的,只能打印出地址,在我看来意义不大。
fetag的方案我觉得不好,
1. 要动用汇编 (当然你可以用C取第一个参数地址 然后根据入栈顺序 一个一个取 不过都不具可移植性)
2. 你总要有方法来实现知道取几个
3. 即使类似于char *之类的,只能打印出地址,在我看来意义不大。
|
没看得很明白你的意思。
纯粹用CHAR * szFmt来记录va_list很容易啊。
SYSTRACE(CHAR * *szFmt,...) 传2维指针, szFmt在函数体外分配空间,SYSTRACE里面把变参写入szFmt就是啦。
|
貌似一般都放在函数入口处,以免中间修改了入口参数吧...
|
这个需求很容易实现啊,只要在函数入口出直接读取堆栈里面的内容然后保存到文件就可以了
|
不知道C99里有没有类似 __FUNC__ 的宏(用于表达函数的参数)供你使用,没有的话估计够呛,去查查吧。你要是编译器还不支持C99就基本无望了....
|
好象perl里有个shift函数有这个功能