您的位置:首页 > 编程语言 > C语言/C++

C语言,仿内核方式实现分级打印 [附:函数指针、回调函数的小示例]

2014-10-14 14:04 531 查看
一、函数指针以及回调

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐