除錯時常常需要逆向追蹤程式流程,如果被呼叫的地方很少,可以直接在呼叫前 printf,但是當很多地方呼叫的時候,一個一個放 printf 似乎不是ㄧ個高效率的作法。
#define FuncName(a, b, c) \
do { \
printf("[%s %d] called FuncName\n",__func__, __LINE__); \
FuncNameReal (a, b, c); \
} while (0)
例如原本有個 function:
int max(int aaa, int bbb) {...}
因為不想改變呼叫的地方,所以要先把 function 名稱改成 _max
然後在 header file 裡面追加
#define max(a, b) printf("[%s %d] called max"); _max(a, b)
這樣呼叫 max 的程式就會自動報上自己是哪個 func,而且同一 func 有多的地方呼叫的話,是在哪一行呼叫也會報出來。
例如原本有個 function:
int max(int aaa, int bbb) {...}
因為不想改變呼叫的地方,所以要先把 function 名稱改成 _max
然後在 header file 裡面追加
#define max(a, b) printf("[%s %d] called max"); _max(a, b)
這樣呼叫 max 的程式就會自動報上自己是哪個 func,而且同一 func 有多的地方呼叫的話,是在哪一行呼叫也會報出來。
帶回傳值的時候
#define FuncName(a, b, c) ({ \
int retval; \
printf("[%s %d] called FuncName\n",__func__, __LINE__); \
retval = FuncNameReal (a, b, c); \
retval;})
參考來源:
GNU CPP Macro-Arguments
沒有留言:
張貼留言