一、函数指针以及回调
#include <stdio.h> #include <stdlib.h> //////////////////////////////////////////// //lib int PRINT_LEVEL = 3 ; // >1 error waring info // 1 error waring // 0 error typedef void(*CALLBACK_PFUNC)(char* s); void lib_callback_pri_info(char* info) { if(PRINT_LEVEL >= 2) printf("info:%s\n",info); } void lib_callback_pri_warning(char * info) { if(PRINT_LEVEL >= 1) printf("waring:%s\n",info); } void lib_callback_error(char* info) { printf("error:%s\n" ,info ); } ///////////////////////////////////////////////////// //main extern int PRINT_LEVEL ;
//print:用户的主调用函数
//CALLBACK_PFUNC pri_func:回调函数
//char* str:传给回调函数的参数
static void print(char* str , CALLBACK_PFUNC pri_func)//print:用户的主调用函数 { pri_func(str); } int main(int argc , char** argv) { CALLBACK_PFUNC func_set[3] = {lib_callback_pri_info , lib_callback_pri_warning , lib_callback_error}; PRINT_LEVEL = atoi(argv[1]);//设置打印等级 print("message_eat!" , func_set[0]); print("message_no_rice!",func_set[1]); print("message_fire!",func_set[2]); } /* 另注:函数名就是函数地址,就是函数指针 假设再这样定义函数类型: typedef void(FUNC)(char* s); 1. typedef void(*CALLBACK_PFUNC)(char* s); FUNC pfunc = lib_callback_error; (*pfunc)(); 和 pfunc();效果相同 2. FUNC func_set[3] = {lib_callback_pri_info , lib_callback_pri_warning , lib_callback_error};是错误的。 FUNC* func_set[3] = {lib_callback_pri_info , lib_callback_pri_warning , lib_callback_error};是正确的。 CALLBACK_PFUNC func_set[3] = {lib_callback_pri_info , lib_callback_pri_warning , lib_callback_error};是正确的。 */ //oucj
root@ubuntu:/mnt/hgfs/jz2440Work/app/func# ./a.out 1
waring:message_no_rice!
error:message_fire!
root@ubuntu:/mnt/hgfs/jz2440Work/app/func# ./a.out 2
info:message_eat!
waring:message_no_rice!
error:message_fire!
root@ubuntu:/mnt/hgfs/jz2440Work/app/func# ./a.out 0
error:message_fire!
二、仿内核方式实现分级打印:
#include <stdio.h> #include <stdlib.h> /////////////////////// int print_level = 2; //////////////////////////// //lib.h extern int print_level; #define PL_KERNEL_INFO 2 //lowest priority #define PL_KERNEL_WARING 1 #define PL_KERNEL_ERROR 0 //highest priority #define KERNEL_INFOS "KERNEL_INFO" #define KERNEL_WARINGS "KERNEL_WARING" #define KERNEL_ERRORS "KERNEL_ERROR" //////////////////////////// //lib.c void printk(char* s) { if(0==strncmp(KERNEL_INFOS, s ,strlen(KERNEL_INFOS))){ if(print_level<PL_KERNEL_INFO){ return ; } s+=strlen(KERNEL_INFOS); printf("kernel_info:"); } if(0==strncmp(KERNEL_WARINGS, s ,strlen(KERNEL_WARINGS))){ if(print_level<PL_KERNEL_WARING){ return ; } s+=strlen(KERNEL_WARINGS); printf("kernel_warning:"); } if(0==strncmp(KERNEL_ERRORS, s ,strlen(KERNEL_ERRORS))){ s+=strlen(KERNEL_ERRORS); printf("kernel_error:"); } printf("%s\n" , s); return ; } ////////////////////////////////////// //app.c void main(int argc , char** argv) { if(argc>1){ print_level = atoi(argv[1]);//设置优先级 } printk(KERNEL_INFOS"loading led!\n"); printk(KERNEL_WARINGS"variable a defined but not used!\n"); printk(KERNEL_ERRORS"cannot loading led!\n"); }
//oucj
root@ubuntu:/mnt/hgfs/jz2440Work/app/func# ./a.out 0
kernel_error:cannot loading led!
root@ubuntu:/mnt/hgfs/jz2440Work/app/func# ./a.out 1
kernel_warning:variable a defined but not used!
kernel_error:cannot loading led!
root@ubuntu:/mnt/hgfs/jz2440Work/app/func# ./a.out 2
kernel_info:loading led!
kernel_warning:variable a defined but not used!
kernel_error:cannot loading led!
root@ubuntu:/mnt/hgfs/jz2440Work/app/func# ./a.out
kernel_info:loading led!
kernel_warning:variable a defined but not used!
kernel_error:cannot loading led!