Я должен использовать макрос PERF_INSTRUMENT
из библиотеки.PERF_INSTRUMENT
ожидает, что пользователь предоставит строку в стиле c в качестве имени функции для печати местоположения этой точки инструмента.
Но я не хочу писать имя функции каждый раз, когда использую 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());
}
Обратите внимание, что я могу изменить только код ниже строки МОЙ КОД