PERF_INSTRUMENTライブラリのマクロを使用する必要があります。PERF_INSTRUMENTこの計器ポイントの位置を出力する関数名として、ユーザーが提供する C スタイルの文字列が必要です。
でも、使うたびに関数名を書くのではなく 、perf ログに関数名が自動的に含まれるようPERF_INSTRUMENTに呼び出したいのです。__func__
しかし、ラムダ関数内に埋め込まれているため、__func__実際に使用すると返されます。operator()__func__
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行の下のコードのみを変更できることに注意してください