Usted puede utilizar una variable estática local, si no se preocupan por la seguridad de rosca.
Aunque esto solo le dará un recuento correcto la primera vez que ejecute su rutina recursiva. Una técnica mejor sería una clase RAII tipo guardia que contiene una variable estática interna. Al comienzo de la rutina recursiva, construye la clase de guardia. El constructor incrementaría la variable estática interna, y el destructor la disminuiría. De esta manera, cuando creas un nuevo marco de pila, el contador se incrementa en uno, y cuando regresas de cada marco de pila, el contador disminuiría en uno.
struct recursion_guard
{
recursion_guard() { ++counter; }
~recursion_guard() { --counter; }
static int counter;
};
int recursion_guard::counter = 0;
void recurse(int x)
{
recursion_guard rg;
if (x > 10) return;
recurse(x + 1);
}
int main()
{
recurse(0);
recurse(0);
}
Sin embargo, tenga en cuenta que esto todavía no es seguro para subprocesos. Si necesita seguridad de subprocesos, puede reemplazar la variable de almacenamiento estático con una variable de almacenamiento local de subprocesos, ya sea utilizando boost::thread_specific_ptr
o las instalaciones locales de subprocesamiento C++ 0x.
es posible que desee echar un vistazo a [esta discusión] (http://stackoverflow.com/questions/582673/is-there-a-cheaper-way-to-find-the-depth-of-the- call-stack-que-usa-backtrace). La conclusión es que puede haber una forma específica de compilación/plataforma para obtener la traza inversa y usar eso ... pero obviamente es muy específica del compilador/plataforma y probablemente susceptible a cosas como la creación de líneas. En cualquier caso, podría valer la pena mirar. –