Est-il possible d'obtenir le nom de la fonction à l'intérieur d'une fonction C++?
Je veux implémenter une fonction traceur, qui serait la trace de combien de temps une fonction est prise à exécuter. J'ai suivantes de la classe pour la même chose:-
class FuncTracer
{
public:
FuncTracer(LPCTSTR strFuncName_in)
{
m_strFuncName[0] = _T('class FuncTracer
{
public:
FuncTracer(LPCTSTR strFuncName_in)
{
m_strFuncName[0] = _T('\0');
if( strFuncName_in ||
_T('\0') != strFuncName_in[0])
{
_tcscpy(m_strFuncName,strFuncName_in);
TCHAR strLog[MAX_PATH];
_stprintf(strLog,_T("Entering Func:- <%s>"),m_strFuncName);
LOG(strLog)
m_dwEnterTime = GetTickCount();
}
}
~FuncTracer()
{
TCHAR strLog[MAX_PATH];
_stprintf(strLog,_T("Leaving Func:- <%s>, Time inside the func <%d> ms"),m_strFuncName, GetTickCount()-m_dwEnterTime);
LOG(strLog)
}
private:
TCHAR m_strFuncName[MAX_PATH];
DWORD m_dwEnterTime;
};
void TestClass::TestFunction()
{
//I want to avoid writing the function name maually..
//Is there any macro (__LINE__)or some other way to
//get the function name inside a function ??
FuncTracer(_T("TestClass::TestFunction"));
/*
* Rest of the function code.
*/
}
');
if( strFuncName_in ||
_T('class FuncTracer
{
public:
FuncTracer(LPCTSTR strFuncName_in)
{
m_strFuncName[0] = _T('\0');
if( strFuncName_in ||
_T('\0') != strFuncName_in[0])
{
_tcscpy(m_strFuncName,strFuncName_in);
TCHAR strLog[MAX_PATH];
_stprintf(strLog,_T("Entering Func:- <%s>"),m_strFuncName);
LOG(strLog)
m_dwEnterTime = GetTickCount();
}
}
~FuncTracer()
{
TCHAR strLog[MAX_PATH];
_stprintf(strLog,_T("Leaving Func:- <%s>, Time inside the func <%d> ms"),m_strFuncName, GetTickCount()-m_dwEnterTime);
LOG(strLog)
}
private:
TCHAR m_strFuncName[MAX_PATH];
DWORD m_dwEnterTime;
};
void TestClass::TestFunction()
{
//I want to avoid writing the function name maually..
//Is there any macro (__LINE__)or some other way to
//get the function name inside a function ??
FuncTracer(_T("TestClass::TestFunction"));
/*
* Rest of the function code.
*/
}
') != strFuncName_in[0])
{
_tcscpy(m_strFuncName,strFuncName_in);
TCHAR strLog[MAX_PATH];
_stprintf(strLog,_T("Entering Func:- <%s>"),m_strFuncName);
LOG(strLog)
m_dwEnterTime = GetTickCount();
}
}
~FuncTracer()
{
TCHAR strLog[MAX_PATH];
_stprintf(strLog,_T("Leaving Func:- <%s>, Time inside the func <%d> ms"),m_strFuncName, GetTickCount()-m_dwEnterTime);
LOG(strLog)
}
private:
TCHAR m_strFuncName[MAX_PATH];
DWORD m_dwEnterTime;
};
void TestClass::TestFunction()
{
//I want to avoid writing the function name maually..
//Is there any macro (__LINE__)or some other way to
//get the function name inside a function ??
FuncTracer(_T("TestClass::TestFunction"));
/*
* Rest of the function code.
*/
}
Je veux savoir si il y a moyen d'obtenir le nom de la fonction à partir de l'intérieur d'une fonction? Fondamentalement, je veux que les utilisateurs de ma classe il suffit de créer un objet de même. Ils ne peuvent pas transmettre le nom de la fonction.
Vous devez vous connecter pour publier un commentaire.
VC++ a
et
Et vous pouvez écrire une macro qui sera lui-même allouer un objet et passer le nom-yelding macro à l'intérieur du constructeur. Qch comme
__FILE__
et__LINE__
mais pas__FUNCTION__
. 1. Est__FUNCTION__
moment de la compilation? 2. est-ce c++ seulement?C99 a
__func__
, mais pour le C++, ce sera compilateur spécifique. Sur le côté de plus, certains de le compilateur versions spécifiques de fournir des informations de type supplémentaires, ce qui est particulièrement agréable quand vous êtes suivi dans un templatized fonction/classe.__FUNCTION__
,__FUNCDNAME__
,__FUNCSIG__
__func__
,__FUNCTION__
,__PRETTY_FUNCTION__
Bibliothèque Boost a défini macro
BOOST_CURRENT_FUNCTION
pour la plupart des compilateurs C++ dans l'en-tête boost/current_function.php. Si le compilateur est trop vieux pour ce faire, le résultat sera "(inconnu)".J'allais dire que je ne connais pas de telle chose, mais ensuite j'ai vu les autres réponses...
Il pourrait vous intéresser de savoir que l'exécution de profils (comme
gprof
) fait exactement ce que vous demandez sur - le suivi de la quantité de temps passé à l'exécution de chaque fonction. Un profileur fonctionne essentiellement par l'enregistrement du pointeur d'instruction (IP), l'adresse de l'en cours d'exécution de l'instruction, de toutes les 10ms ou donc. Une fois que le programme est fait en cours d'exécution, vous invoquez un post-processeur qui examine la liste des IPs et le programme, et convertit ces adresses dans les noms de fonction. Donc, je vous suggère de simplement en utilisant le pointeur d'instruction, plutôt que le nom de la fonction, à la fois parce qu'il est plus facile de code et parce qu'il est plus efficace de travailler avec un seul numéro qu'avec une chaîne.