我正在研究一个调试/日志记录程序,并想知道是否可以创建一个可以粘贴到每个函数内部的宏,并且它将打印函数名称以及每次调用函数时的参数值。函数名称可以在编译时解决,问题是如何打印参数值?宏从函数内部获取函数名称和参数值
更新:我记得阅读一篇文章来获取参数,但它调用了汇编代码和工作操作堆栈指针,这不是跨平台兼容的 - 我需要的东西。
我正在研究一个调试/日志记录程序,并想知道是否可以创建一个可以粘贴到每个函数内部的宏,并且它将打印函数名称以及每次调用函数时的参数值。函数名称可以在编译时解决,问题是如何打印参数值?宏从函数内部获取函数名称和参数值
更新:我记得阅读一篇文章来获取参数,但它调用了汇编代码和工作操作堆栈指针,这不是跨平台兼容的 - 我需要的东西。
您可以使用__FUNCTION__
或__func__
宏作为函数名称。对于参数,我不认为有一个内置的宏来实现这一点。
其他有用的宏是__LINE__
和__FILE__
。
编辑:
__FUNCTION__
和__func__
不是标准的一部分,但它们被广泛的支持。
16.8涉及预定义宏:
__cplusplus
__DATE__
__FILE__
__LINE__
__STDC_HOSTED__
__TIME__
和宏实现定义:
__STDC__
__STDC_VERSION__
__STDC_ISO_10646__
'__func__' *是标准的一部分,但它不是一个宏。也许这就是为什么你没有在那个地方找到它。 – 2012-03-01 20:24:44
@JensGustedt我们在谈论C++标准? – 2012-03-01 20:27:14
不,我在谈论C.在C11中它是6.4.2.2,一个预定义的标识符,而不是一个宏。 AFAIR已经在C99中,所以它也应该在C++中。 – 2012-03-01 20:41:48
对于函数名,你可以使用标准的(因为C99)标识符__func__
。
在C++中,GNU扩展标识符__PRETTY_FUNCTION__
也将打印参数类型。
提问者声明他知道如何从宏中获取函数名 - 他担心的是打印函数参数。 – Perry 2012-03-01 20:47:52
没有可移植的方式来获取所有的参数值并打印它们 - 你肯定不能从宏中完成。你可能需要使用另一种方法来实现你想要的。
另一种方法是什么?我当然可以用宏来替代C代码。 – tunafish24 2012-03-01 19:59:01
你可以做一些丑陋的事情,在这些事情中你使用一个为函数声明剔除代码的宏来完成所有的函数声明,然后在函数本身的头部打印出它们的值。这不太好 - 我不会走这条路。那种方式就是疯狂。在现实世界中,只需使用gdb,或在需要时打印所需的内容。 – Perry 2012-03-01 20:06:59
@Perry你会怎么做呢?如果你能提供一个实际的例子,请+1。 – 2012-03-01 20:13:23
C或C++?不同的语言。 – Puppy 2012-03-01 19:51:27
但两者的宏应该是相同的,我选择了扩大观众 – tunafish24 2012-03-01 19:53:55