C语言,仿内核方式实现分级打印 [附:函数指针、回调函数的小示例]
2014-10-14 14:04
531 查看
一、函数指针以及回调
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!
二、仿内核方式实现分级打印:
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!
三、更多借鉴:
1. printf 的宏定义版本 /article/3647128.html
#define DEBUG(format, ...) printf (format, ##__VA_ARGS__)(' ## '的意思是,如果可变参数被忽略或为空,将使预处理器( preprocessor )去除掉它前面的那个逗号。)于是乎,我们神奇地发现,DEBUG完全取代了printf,所有的DEBUG(…)都被完成的替换成了printf(…)
暂时不看,有点乱。2. 总结几种log打印printf函数的宏定义 http://blog.chinaunix.net/uid-20564848-id-73402.html
#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!
三、更多借鉴:
1. printf 的宏定义版本 /article/3647128.html
#define DEBUG(format, ...) printf (format, ##__VA_ARGS__)(' ## '的意思是,如果可变参数被忽略或为空,将使预处理器( preprocessor )去除掉它前面的那个逗号。)于是乎,我们神奇地发现,DEBUG完全取代了printf,所有的DEBUG(…)都被完成的替换成了printf(…)
暂时不看,有点乱。2. 总结几种log打印printf函数的宏定义 http://blog.chinaunix.net/uid-20564848-id-73402.html
相关文章推荐
- C语言之最好理解的通过函数指针作为参数实现回调函数
- [华赛面试题] C语言动态分配内存 用指针实现字符串的函数体外打印
- C语言学习之 通过指向函数的指针 实现函数的调用
- c语言:实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定
- 用C和C++,两种方式实现C语言中的printf函数
- c语言:实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定
- 用指针方式实现strcat(s,t)函数
- 【C语言】函数指针与回调函数
- 返回指向函数的指针(尾置返回类型的方式实现)
- 【C语言】函数指针与回调函数
- what's in string? c语言string类函数实现汇总 都是学习使用指针的好例子啊(算是读书摘抄和笔记吧)
- what's in string? c语言string类函数实现汇总 觉得都是学习使用指针的好例子(算是读书摘抄和笔记吧)
- C语言写函数实现接收n个字符串,将以某个字符为开头的字符串打印出来。
- 回调函数的实现(指向类成员函数的指针)
- C语言:实现一个函数,打印乘法口诀表,如:输入9,输出9*9口诀表
- 通过交换虚函数表指针查看虚函数的实现方式
- C语言中函数指针、指针函数、回调函数的简单含义
- 函数指针使用示例(参考Linux-内核代码)
- C语言:实现一个函数,打印乘法口诀表,如:输入9,输出9*9口诀表
- C语言中的回调函数(函数指针)