TBOX內置的libc庫,有一份自有的printf實現,在支持了全部標準格式化參數的同時,也對其進行了一些擴展,來支持自定義的格式化參數打印, 例如:ios
// 輸出定點數:3.14 tb_printf("%{fixed}\n", tb_float_to_fixed(3.14)); // 輸出ipv4地址:127.0.0.1 tb_ipv4_t addr; tb_ipv4_set(&addr, "127.0.0.1"); tb_printf("%{ipv4}\n", &addr);
以上兩種都是TBOX內置的對象參數打印,你只須要吧你須要打印的對象名和對象描述函數註冊進來,就好了。git
其中%{object_name}
就是自定義參數化對象打印的格式,這個是對%s、%f等標準格式的擴展,使你能夠像ios中的NSLog(@"%@", object)
那樣方便的打印自定義對象的內容。github
例如:若是你要支持自定義打印以下內容:函數
typedef struct _rect_t { tb_long_t x; tb_long_t y; tb_size_t w; tb_size_t h; }rect_t; tb_printf("%{rect}\n", &rect);
那麼你只須要提供對應的rect對象的描述函數,並對其進行註冊,就好了:.net
// rect對象的描述函數,將描述內容格式化到cstr中,並返回實際的字符串大小 static tb_long_t tb_printf_rect_func(tb_cpointer_t object, tb_char_t* cstr, tb_size_t maxn) { // check tb_assert_and_check_return_val(object && cstr && maxn, -1); // the rect rect_t* rect = (rect_t*)object; // format tb_long_t size = tb_snprintf(cstr, maxn - 1, "(x: %ld, y: %ld, w: %lu, h: %lu)", rect->x, rect->y, rect->w, rect->h); if (size >= 0) cstr[size] = '\0'; // ok? return size; } // 註冊%{rect}對象的printf參數化打印支持,注:最好在程序初始化階段來進行註冊 tb_printf_object_register("rect", tb_printf_rect_func); // 打印rect對象信息,顯示:"(x: 10, y: 10, w: 640, h: 480)" rect_t rect = {10, 10, 640, 480}; tb_printf("%{rect}\n", &rect);
固然不單單隻有printf支持自定義的參數化對象打印,只要是printf系列的都支持這個特性,例如以下接口:code
等等,這些都是能夠自定義的參數化對象打印,每一個對象,只要註冊一次就好了。orm