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

 一、函数指针以及回调

#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!

 

你可能感兴趣的:(回调函数)