C語言:類似linux內核的分等級DEBUG宏(打印宏)


總結幾種log打印printf函數的宏定義 http://blog.chinaunix.net/uid-20564848-id-73402.html

#include <stdio.h>

#define lU_DEBUG_PREFIX "##########"

#define LU_DEBUG_CMD 0x01
#define LU_DEBUG_DATA 0x02
#define LU_DEBUG_ERROR 0x04

#define LU_PRINTF_cmd(msg...) do{if(g_lu_debugs_level & LU_DEBUG_CMD)printf(lU_DEBUG_PREFIX msg);}while(0)
#define LU_PRINTF_data(msg...) do{if(g_lu_debugs_level & LU_DEBUG_DATA)printf(lU_DEBUG_PREFIX msg);}while(0)
#define LU_PRINTF_error(msg...) do{if(g_lu_debugs_level & LU_DEBUG_ERROR)printf(lU_DEBUG_PREFIX msg);}while(0)


#define lu_printf(level, msg...) LU_PRINTF_##level(msg)
#define lu_printf2(...) printf(__VA_ARGS__)
#define lu_printf3(...) lu_printf(__VA_ARGS__)
static int lu_printf4_format(int prio, const char *fmt, ...);
#define lu_printf4(prio, fmt...) lu_printf4_format(prio, fmt)


int g_lu_debugs_level; //控制打印等級的全局開關
//lu_printf 類似內核的分等級打印宏,根據g_lu_debugs_level和輸入的第一個標號名來決定該句打印是否輸出。
//lu_printf3 等同於 lu_printf
//lu_printf2 等同於 printf
//lu_printf4 等同於 lu_printf4_format,作用是把輸入的第一個整型參數用<val>的格式打印出來
int main(int argc, char *argv[])
{
    g_lu_debugs_level |= LU_DEBUG_CMD | LU_DEBUG_DATA | LU_DEBUG_ERROR;
    printf("g_lu_debugs_level = %p\n", g_lu_debugs_level);
    lu_printf(cmd,"this is cmd\n");
    lu_printf(data,"this is data\n");
    lu_printf(error,"this is error\n");
    g_lu_debugs_level &= ~(LU_DEBUG_CMD | LU_DEBUG_DATA);
    printf("g_lu_debugs_level = %p\n", g_lu_debugs_level);
    lu_printf(cmd,"this is cmd\n");
    lu_printf(data,"this is data\n");
    lu_printf(error,"this is error\n");
    lu_printf2("aa%d,%s,%dbbbbb\n", 20, "eeeeeee", 100);
    g_lu_debugs_level |= LU_DEBUG_CMD | LU_DEBUG_DATA | LU_DEBUG_ERROR;
    printf("g_lu_debugs_level = %p\n", g_lu_debugs_level);
    lu_printf3(cmd,"this is cmd \n");
    lu_printf3(data,"this is data\n");
    lu_printf3(error,"this is error\n");
    lu_printf4(0,"luther %s ,%d ,%d\n", "gliethttp", 1, 2);
    return 0;
}

#include <stdarg.h>
static int lu_printf4_format(int prio, const char *fmt, ...)
{
#define LOG_BUF_SIZE (4096)
    va_list ap;
    char buf[LOG_BUF_SIZE];

    va_start(ap, fmt);
    vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
    va_end(ap);

    printf("<%d>: %s", prio, buf);
    printf("------------------------\n");
    printf(buf);
}


#define ENTER() LOGD("enter into %s", __FUNCTION__)

#define LOGD(...) ((void)LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__))

#define LOG(priority, tag, ...) \
    LOG_PRI(ANDROID_##priority, tag, __VA_ARGS__)

#define LOG_PRI(priority, tag, ...) \
    android_printLog(priority, tag, __VA_ARGS__)

#define android_printLog(prio, tag, fmt...) \
    __android_log_print(prio, tag, fmt)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM