2016-11-27 69 views
0

宏是有辦法,如何巧妙地傳遞變量的名稱和它的值到調試宏?我現在使用的是「只是」這個。調試打印用變量名

#if DEBUG_LEVEL >= 1 
#define DEBUG_PRINT(fmt, ...) do{\ 
fprintf(stderr, ANSI_COLOR_YELLOW "[DEBUG]: %s:%c\t", __FILE__, __LINE__);\ 
fprintf(stderr, fmt ANSI_COLOR_RESET, __VA_ARGS__);}while(0) 
#else 
#define DEBUG_PRINT(...) 
#endif 

#define STR(x) #x 

它是通過各種手段,但是當我要輸出什麼變量屬於,我使用的名稱構建這樣的,它很容易變得太麻煩了。

DEBUG_PRINT(STR(min_a)": %u\t"STR(max_a)": %u\t"STR(min_c)": %u\t"STR(max_c)":%u\t"STR(min_m)": %u\t"STR(max_m)":%u\t"STR(d)": %d\n", min_a, max_a, min_c, max_c, min_m, max_m, d); 

有沒有一種方法,如何以這樣的方式在DEBUG_PRINT擺脫那些STR(x),即變量名稱保持可見和整體格式保持幾乎相同的?如果可能的話,我不介意放入格式說明符,儘管我的第一個想法是擺脫這些。最重要的是保留可變數量的參數。

所以我的問題是,如何編寫一個宏,執行此操作的「漂亮的打印」,無需調用STR(X) - 是這樣的:DEBUG_PRINT_VARS(min_a, max_a, min_c, max_c, min_m, max_m, d)

+1

我看到你沒有什麼優勢相比寫道:'DEBUG_PRINT( 「min_a:%U \ tmax_a:%U \ tmin_c:%U \ tmax_c:%U \ tmin_m:%U \ tmax_m:%U \ TD:%d \ n」,min_a,max_a, min_c,max_c,min_m,max_m,d);' - 你眼中的'STR'宏有什麼好處?這是我如何寫一個'printf()'語句來打印變量。如果你使用'DEBUG_PRINT_VARS(min_a,max_a,min_c,max_c,min_m,max_m,d)'因爲你的宏調用,則實現將使用STR的'變體(X)'來字符串化每個名稱(和迭代處理變量參數等),但這是相當不同的。 –

+0

@JonathanLeffler是的,這就是主意,不要像這樣繁瑣地編寫字符串。或寫入的方式,你如何使用它,而是像'DEBUG_PRINT_VARS(min_a,max_a,min_c,max_c,min_m,max_m,d)'的呼喚 - 我有麻煩寫作。 – Otaj

+0

我們無法回答您沒有問過的問題。我不知道,我準備做必要的研究以獲得[升壓預處理器(http://www.boost.org/doc/libs/release/libs/preprocessor/doc/index.html)做工作,但我認爲它可以。類型信息是一個問題。我使用了'DEBUG_PRINT_INT(int_var);'和該主題上的變體 - 沒有可變長度參數列表。我認爲,如果你打算做'DEBUG_PRINT_VARS()'任意類型的工作,你可能需要:'DEBUG_PRINT_VARS(min_a, 「%U」,max_a, 「%U」,...)'指定格式/類型以及變量名稱。 –

回答

0

嗯,我有點解決它現在通過使用MAP宏(https://github.com/swansontec/map-macro),編輯它允許兩個參數函數,然後具有:

#if DEBUG_LEVEL >= 1 
#define DEBUG_PRINT(...) do{\ 
fprintf(stderr, ANSI_COLOR_YELLOW "[DEBUG]: %s:%d\t", __FILE__, __LINE__);\ 
MAP(PRINT_ARG, __VA_ARGS__); \ 
fprintf(stderr, "\n" ANSI_COLOR_RESET);}while(0) 
#else 
#define DEBUG_PRINT(...) 
#endif 

#define PRINT_ARG(x, y) fprintf(stderr, #x": "y"\t", x); 

和使用它像這樣

DEBUG_PRINT(min_a, "%u", max_a, "%u", min_c, "%u", max_c, "%u", min_m, "%u", max_m, "%u", d, "%d"); 

它回答了這個問題本身,所以這就是爲什麼我發佈它作爲答案,雖然我真的很想找到一種方法,如何產生轉換說明含蓄地