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