使用printf定製化打印對象

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

  • tb_printf
  • tb_snprintf
  • tb_vsnprintf
  • tb_wprintf
  • tb_swprintf
  • tb_vswprintf
  • tb_trace_i
  • tb_trace_d
  • tb_trace_e
  • tb_trace_w

等等,這些都是能夠自定義的參數化對象打印,每一個對象,只要註冊一次就好了。orm


相關文章
相關標籤/搜索