3

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行の下のコードのみを変更できることに注意してください

4

2 に答える 2