Bạn có thể sử dụng một biến tĩnh địa phương, nếu bạn không quan tâm đến thread-an toàn.
Mặc dù, điều này sẽ chỉ cung cấp cho bạn số lượng thích hợp trong lần đầu tiên bạn chạy quy trình đệ quy của mình. Một kỹ thuật tốt hơn sẽ là một lớp bảo vệ kiểu RAII có chứa một biến tĩnh bên trong. Khi bắt đầu quy trình đệ quy, hãy xây dựng lớp bảo vệ. Các nhà xây dựng sẽ tăng biến tĩnh nội bộ, và destructor sẽ decrement nó. Bằng cách này, khi bạn tạo một khung ngăn xếp mới, bộ đếm tăng thêm một, và khi bạn quay trở lại từ mỗi khung ngăn xếp, bộ đếm sẽ giảm đi một.
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);
}
Lưu ý rằng điều này vẫn không an toàn chỉ. Nếu bạn cần an toàn luồng, bạn có thể thay thế biến lưu trữ tĩnh bằng biến luồng-cục bộ lưu trữ, hoặc sử dụng boost::thread_specific_ptr
hoặc các tiện ích cục bộ của C++ 0x.
Nguồn
2010-10-29 22:29:01
bạn có thể muốn xem [thảo luận này] (http://stackoverflow.com/questions/582673/is-there-a-cheaper-way-to-find-the-depth-of-the- call-stack-than-sử dụng-backtrace). Điểm mấu chốt là có thể có một trình biên dịch/nền tảng cụ thể cách để có được backtrace và sử dụng mà ... nhưng nó rõ ràng là rất biên dịch/nền tảng cụ thể và có lẽ dễ bị những thứ như nội tuyến. Trong mọi trường hợp, có thể đáng xem. –