Чтобы отладить рекурсивную программу, я считаю полезным визуализировать, насколько глубоко вложены мои вызовы функций. Я хотел бы иметь что-то вроде __func__
, но за то, насколько глубока моя трассировка стека, а не то, как называется моя функция. Я понимаю, что для компилятора было бы невозможно просто знать об этом, потому что то, как вы вложены, является динамически генерируемым значением. Но для компилятора не составит труда добавить возможности в реализовать , вы можете просто добавить 1 к глобальному счетчику перед каждым call
и вычесть 1 перед тем, как съесть ret
.
Я использую следующий оператор отладки (найдено здесь ):
#define printdbg(Level, formatString, ...) \
do { \
fprintf(stderr, "%s:%d %s: " formatString "\n", \
__FILE__, __LINE__, __func__, ##__VA_ARGS__); \
if (Level == LEVEL_ERROR) { printf("quitting\n"); exit(1); }\
} while (0)
Я хотел бы добавить дополнительный предопределенный идентификатор в начале, где я могу использовать что-то в форме printf("%*s", __NEST__+1, ":")
, чтобы печатать в общей сложности __NEST__
пробелов в начале каждого оператора отладки, чтобы позволить мне визуализировать как глубоко в стеке был сделан каждый оператор отладки.
Я знаю, что мог бы просто иметь глобальный счетчик, который я ++
в начале каждой функции и --
в конце, но я просто узнал о предопределенных идентификаторах, и они так прохладно! Также не нужно заново изобретать колесо.
Я не могу найти список поддерживаемых предопределенных идентификаторов в Интернете. Все, что я нашел, это это и это , ни один из которых не претендует на полноту. Если существует эквивалент __NEST__
, кто-то здесь, вероятно, знает одно слово, которое я ищу. Если его нет, то где я могу найти хорошо документированный список всех предопределенных идентификаторов?