Sen, yerel bir statik değişkeni kullanabilirsiniz.
bu sadece uygun bir alınma sayısı size özyinelemeli rutin ilk kez çalıştırdığınızda verecektir rağmen. Daha iyi bir teknik, bir iç statik değişken içeren bir RAII koruyucu tipi sınıf olurdu. Yinelemeli rutinin başlangıcında, koruma sınıfını inşa edin. Yapıcı içsel statik değişkeni artıracak ve yıkıcı bunu azaltacaktır. Bu şekilde, yeni bir yığın-çerçeve oluşturduğunuzda, sayaç birer birer artar ve her bir istif çerçevesinden döndüğünüzde, sayaç birer birer azalır.
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);
}
Ancak, bunun hala vida dişi olmadığını unutmayın. Eğer iş parçacığı güvenliği gerekiyorsa, boost::thread_specific_ptr
kullanarak veya C++ 0x parçacığı yerel tesisler, ya bir iş parçacığı yerel depolama değişkenle statik depolama değişkeni yerini alabilir. Yeni bir kaynak görüşmesi başlattığınızda
Elbette
void recursive()
{
static int calls = 0;
calls++;
recursive();
}
, bu sayım tutacak Fonksiyondaki statik değişkenini kullanabilirsiniz
[bu tartışmaya] bir göz atmak isteyebilirsiniz (http://stackoverflow.com/questions/582673/is-there-a-cheaper-way-to-find-the-depth-of-the- geçirici yığını-daha-kullanan-BackTrace). Sonuç olarak, backtrace'i elde etmek için bir derleyici/platforma özel bir yol olabileceği ve bunu kullanabileceği ... ama açıkça derleyici/platforma özel ve muhtemelen inline gibi şeylere duyarlı. Her durumda, bir göz atmaya değer olabilir. –