我已经使用-finstrument-functions
gcc 的选项和这个(简化的)代码实现了跟踪行为:
void __cyg_profile_func_enter(void *this_fn, void *call_site)
{
Dl_info di;
if(dladdr(this_fn, &di))
printf("entered %s\n", (di.dli_sname?di_dli_sname:"<unknown>"));
}
这很好用,除了一件事:宏也会被处理,但函数会打印包含宏的函数的信息。
因此,包含宏的函数会多次打印其信息(这当然是不希望的)。
有什么可以检测到正在处理宏吗?或者是否可以完全关闭检测宏?
PS同样的问题发生sizeof()
编辑:澄清:我正在寻找一种解决方案来防止宏与检测功能混淆(他们不应该这样做)。不适用于跟踪宏、函数和/或其他事物的方法。