再帰的なプログラムをデバッグするには、関数呼び出しがどれほど深くネストされているかを視覚化すると便利です。のようなものが欲しい__func__
のですが、関数名ではなく、スタックトレースの深さについてです。ネストの度合いは動的に生成される値であるため、コンパイラがこれを単純に知ることは不可能であることを理解しています。しかし、コンパイラがこれを実装する機能を追加することは難しくありません。それぞれの前にグローバルカウンターに 1 を追加し、call
eat の前に 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__
スペースを出力し、各デバッグステートメントがスタックの深さを視覚化できるようにしたいと思いますから作られた。
++
各関数の開始時と--
終了時に単純にグローバル カウンターを使用できることはわかっていますが、定義済みの識別子について学んだばかりで、とてもクールです! また、車輪を再発明する必要はありません。
サポートされている定義済み識別子のリストがオンラインのどこにも見つかりません。私が見つけたのはthisとthisだけで、どちらも包括的なものではありません。に相当するものが__NEST__
存在する場合、ここにいる誰かがおそらく私が探している単語を 1 つ知っているでしょう。存在しない場合、事前定義されたすべての識別子の十分に文書化されたリストはどこにありますか?