我必须使用PERF_INSTRUMENT
库中的宏。PERF_INSTRUMENT
期望用户提供 c 风格的字符串作为函数名来打印该仪器点的位置。
但是,我不想在每次使用时都写函数名,PERF_INSTRUMENT
而是想用它来调用它,__func__
以便函数名自动包含在 perf 日志中。
但是当我使用__func__
它时,它实际上会返回operator()
,因为__func__
它嵌入在 lambda 函数中。
main()
他们是我可以将函数名称传递给PERF_INSTRUMENT
宏的任何方式吗?
#include <cstdio>
#include <cassert>
#include <type_traits>
using namespace std;
namespace /* anonymous */
{
template< typename T >
struct Is_Const_Char_Array
: std::is_same< std::remove_reference_t< T >,
char const[ std::extent< std::remove_reference_t< T > >::value ] >
{};
template< typename T >
struct Is_C_String_Literal
: Is_Const_Char_Array< T >
{};
}
#define PERF_INSTRUMENT(name) auto instObj = [] { static_assert( Is_C_String_Literal< decltype( name ) >::value, "input argument must be a c-string literal" ); /* Some other Logic*/ printf(name);return 1; }()
// <------------------ MY CODE -------------------> //
int main(){
PERF_INSTRUMENT("main"); // <-- this works fine
PERF_INSTRUMENT(__func__); // <-- this prints operator()
// PERF_INSTRUMENT(__builtin_FUNCTION());
}
请注意,我只能更改 MY CODE 行下方的代码