【发布时间】:2021-11-17 21:42:46
【问题描述】:
我需要一些宏或其他方式来打印当前函数及其参数。对于函数名称,这很简单,因为我们可以使用例如__PRETTY_FUNCTION__。是否有一些包含函数参数的宏?或者您可以将va_list 和va_start 用于非可变函数吗?
类似于__VA_ARGS__ 的东西,但用于常规函数,而不是宏。只要它有效,我不介意将它从某些符号表等中取出。
要做这样的事情:
#define FUNC_ENTER printName(__PRETTY_FUNCTION__); printArgs(__WHAT_IM_MISSING__);
void someFunc(int a, int b)
{
FUNC_ENTER;
// ... rest of the function ...
}
void main()
{
someFunc(5, 10);
// Should print "Entering 'someFunc' with '5 10'" or something similar.
}
P.S.1。我知道我可以通过编写 FUNC_ENTER(a, b) 来实现它 - 但我想省去自己输入参数的时间
附注 2。不要建议 GCC 的 __cyg_profile_func_enter - 因为我不希望 每个 函数都使用这个宏。
【问题讨论】:
-
不,除非您将实际参数传递给宏,否则实际上不可能通用地创建类似的东西。
-
问题是预处理器正在处理文本,而不是 C 代码。因此它不知道存在类似函数参数的东西。它甚至不知道宏在函数体内展开
-
但是您可以使用 xmacro 将 both 扩展为函数参数和打印命令。虽然代码可能有点混淆
-
C 还是 C++? C++ 有一些 C 没有的技巧。所以区分很重要
标签: c++ c gcc macros profiling