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)
我看到你沒有什麼優勢相比寫道:'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)'來字符串化每個名稱(和迭代處理變量參數等),但這是相當不同的。 –
@JonathanLeffler是的,這就是主意,不要像這樣繁瑣地編寫字符串。或寫入的方式,你如何使用它,而是像'DEBUG_PRINT_VARS(min_a,max_a,min_c,max_c,min_m,max_m,d)'的呼喚 - 我有麻煩寫作。 – Otaj
我們無法回答您沒有問過的問題。我不知道,我準備做必要的研究以獲得[升壓預處理器(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」,...)'指定格式/類型以及變量名稱。 –