±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcsdn£¬±¾ÎĽ«»á¼òµ¥½éÉÜÁËÈçºÎ¶¨Ò庯ÊýÖ¸ÕëÒÔ¼°º¯ÊýÖ¸ÕëµÄÓ¦ÓÃÀ´ÊµÏֻص÷£¬Ï£Íû¶ÔÄúµÄѧϰÄÜÓÐËù°ïÖú¡£ |
|
»Øµ÷º¯ÊýµÄʹÓÃ
»Øµ÷º¯ÊýÔÚCÓïÑÔÖÐÊÇͨ¹ýº¯ÊýÖ¸ÕëÀ´ÊµÏÖµÄ,ͨ¹ý½«»Øµ÷º¯ÊýµÄµØÖ·´«¸ø±»µ÷º¯Êý´Ó¶øÊµÏֻص÷¡£Òò´Ë£¬ÒªÊµÏֻص÷£¬±ØÐëÊ×Ïȶ¨Ò庯ÊýÖ¸Õë¡£
1. »Øµ÷Ö¸Õë
¸ÅÄָÕëÊÇÒ»¸ö±äÁ¿£¬ÊÇÓÃÀ´Ö¸ÏòÄÚ´æµØÖ·µÄ¡£Ò»¸ö³ÌÐòÔËÐÐʱ£¬ËùÓкÍÔËÐÐÏà¹ØµÄÎï¼þ¶¼ÊÇÐèÒª¼ÓÔØµ½ÄÚ´æÖУ¬Õâ¾Í¾ö¶¨Á˳ÌÐòÔËÐÐʱµÄÈκÎÎï¼þ¶¼¿ÉÒÔÓÃÖ¸ÕëÀ´Ö¸ÏòËü¡£º¯ÊýÊÇ´æ·ÅÔÚÄÚ´æ´úÂëÇøÓòÄڵģ¬ËüÃÇͬÑùÓеØÖ·£¬Òò´ËͬÑù¿ÉÒÔÓÃÖ¸ÕëÀ´´æÈ¡º¯Êý£¬°ÑÕâÖÖÖ¸Ïòº¯ÊýÈë¿ÚµØÖ·µÄÖ¸Õë³ÆÎªº¯ÊýÖ¸Õë¡£
1. ²ÉÓú¯Êýµ÷ÓõÄÒ»°ãÐÎʽ
Ê×ÏÈ¿´Ò»¸öhello world!µÄ³ÌÐò£º
int application_start(
void )
{
OSStatus err = kNoErr;
char *s ="hello world !";
app_log(" s:%s",s);
return err;
} |
´òÓ¡µÄ½á¹ûÊÇ:
[0][TCP: main.c:
90] s:hello world ! |
Èç¹û²ÉÓú¯Êýµ÷ÓõÄÐÎʽÀ´ÊµÏÖ£º
//ÉùÃ÷
void Islog( char *s);
int application_start( void )
{
OSStatus err = kNoErr;
Islog("hello world !");
return err;
}
void Islog( char *s){
app_log(" s:%s",s);
} |
´òÓ¡µÄ½á¹ûÊÇ:
[0][TCP: main.c:
90] s:hello world ! |
2. ¼òµ¥µÄº¯ÊýÖ¸ÕëµÄÓ¦ÓÃ
ÐÎʽ1£º·µ»ØÀàÐÍ(*º¯ÊýÃû)(²ÎÊý±í)
°ÑÉÏÃæµÄÀý×ӸijÉʹÓüòµ¥µÄº¯ÊýÖ¸ÕëµÄд·¨£º
//ÉùÃ÷
void Islog( char *s);
int application_start( void )
{
OSStatus err = kNoErr;
void (*fp)(char *s);//ÉùÃ÷Ò»¸öº¯ÊýÖ¸Õë(fp)
fp = Islog;//½«IslogµÄº¯ÊýÈë¿ÚµØÖ·¸¶¸øfp
fp("hello world !");//º¯ÊýÖ¸ÕëfpʵÏÖº¯Êýµ÷ÓÃ
return err;
}
void Islog( char *s){
app_log(" s:%s",s);
} |
´òÓ¡µÄ½á¹ûÊÇ:
[0][TCP: main.c:
90] s:hello world ! |
ÓÉÉÏÖªµÀ£ºº¯ÊýÖ¸Õ뺯ÊýµÄÉùÃ÷Ö®¼äÎ¨Ò»Çø±ð¾ÍÊÇ£ºÓÃÖ¸ÕëÃû(*fp)´úÌæÁ˺¯ÊýÃûIslog£¬ÕâÑùÉùÃ÷ÁËÒ»¸öº¯ÊýÖ¸Õ룬Ȼºó½øÐи³Öµfp=
Islog ¾Í¿ÉÒÔ½øÐÐÖ¸Õ뺯ÊýµÄµ÷ÓÃÁË£¬ÉùÃ÷º¯ÊýÖ¸Õëʱ£¬Ö»Òª·µ»ØÖµÀàÐÍ¡¢²ÎÊý¸öÊý¡¢²ÎÊýÀàÐ͵ȱ£³ÖÒ»Ö£¬¾Í¿ÉÒÔÉùÃ÷Ò»¸öº¯ÊýÖ¸ÕëÁË¡£×¢Ò⣬º¯ÊýÖ¸Õë±ØÐëÀ¨ºÅÀ¨ÆðÀ´
void (*fp)(char *s)¡£
3. ʹÓÃtypedef¸ü¼òµ¥
ʵ¼ÊÖУ¬ÎªÁË·½±ã£¬Í¨³£Ê¹Óú궨ÒåµÄ·½Ê½ÉùÃ÷º¯ÊýÖ¸Õë¡£
ÐÎʽ2£º·µ»ØÀàÐÍ(*ÐÂÀàÐÍ)(²ÎÊý±í)
typedef void
(*intFunc)(int); |
´Ëºê¶¨ÒåµÄÒâ˼ÊÇÒª¶¨ÒåµÄÀàÐÍÊÇvoid (*)(int)£¬¼´²ÎÊýÒ»¸öint,ʲôҲ²»·µ»ØµÄº¯ÊýÖ¸Õ룬¶¨ÒåµÄ±ðÃûÊÇintFunc¡£
²ÉÓú궨ÒåµÄ·½Ê½ÉùÃ÷º¯ÊýÖ¸Õ뽫ÉÏÉÏÃæµÄ´úÂë¸Äд:
//ºê¶¨Òå
typedef void(*FP)(char *s);
//ÉùÃ÷
void Islog( char *s);
int application_start( void )
{
OSStatus err = kNoErr;
FP fp; //ͨ³£Ê¹ÓúêFPÀ´ÉùÃ÷Ò»¸öº¯ÊýÖ¸Õëfp
fp = Islog;//½«IslogµÄº¯ÊýÈë¿ÚµØÖ·¸¶¸øfp
fp("hello world !");//º¯ÊýÖ¸ÕëfpʵÏÖº¯Êýµ÷ÓÃ
return err;
}
void Islog( char *s){
app_log(" s:%s",s);
} |
´òÓ¡µÄ½á¹ûÊÇ:
[0][TCP: main.c:
90] s:hello world ! |
4. º¯ÊýÖ¸ÕëÊý×é
ÏÂÃæµÄÊÇÖ¸Õ뺯ÊýÊý×éµÄÀý×Ó£º
Àý×Ó1£º
//ºê¶¨Òå
typedef void(*FP)(char *s);
//ÉùÃ÷
void Islog1( char *s);
void Islog2( char *s);
void Islog3( char *s);
int application_start( void )
{
OSStatus err = kNoErr;
//void* Islog[] = {Islog1,Islog2,Islog3};//¶¨ÒåÁËÖ¸ÕëÊý×飬ÕâÀïaÊÇÒ»¸öÆÕָͨÕë
//Islog3[0] ("hello world !");//±àÒë´íÎó,Ö¸ÕëÊý×é²»ÄÜÓÃϱêµÄ·½Ê½À´µ÷Óú¯Êý
FP Islog[] = {Islog1,Islog2,Islog3};//¶¨ÒåÒ»¸öº¯ÊýÖ¸ÕëµÄÊý×é,ÕâÀïµÄfÊÇÒ»¸öº¯ÊýÖ¸Õë
Islog[0] ("hello world!");
Islog[1] ("hello world!");
Islog[2] ("hello world!");
return err;
}
void Islog1( char *s){app_log(" s:%s",s);}
void Islog2( char *s){app_log(" s:%s",s);}
void Islog3( char *s){app_log(" s:%s",s);} |
´òÓ¡µÄ½á¹ûÊÇ:
[0][TCP: main.c:
101] s:hello world!
[4][TCP: main.c: 103] s:hello world!
[7][TCP: main.c: 105] s:hello world! |
Àý×Ó2£º
//ºê¶¨Òå
typedef void(*FP)( char *s,int count);
//ÉùÃ÷
void Islog1( char *s,int count);
void Islog2( char *s,int count);
void Islog3( char *s,int count);
int application_start( void )
{
OSStatus err = kNoErr;
//void* Islog[] = {Islog1,Islog2,Islog3};//¶¨ÒåÁËÖ¸ÕëÊý×飬ÕâÀïaÊÇÒ»¸öÆÕָͨÕë
//Islog3[0] ("hello world !");//±àÒë´íÎó,Ö¸ÕëÊý×é²»ÄÜÓÃϱêµÄ·½Ê½À´µ÷Óú¯Êý
FP Islog[] = {Islog1,Islog2,Islog3};//¶¨ÒåÒ»¸öº¯ÊýÖ¸ÕëµÄÊý×é,ÕâÀïµÄfÊÇÒ»¸öº¯ÊýÖ¸Õë
Islog[0] ("hello world!",1);
Islog[1] ("hello world!",2);
Islog[2] ("hello world!",3);
return err;
}
void Islog1( char *s,int count){app_log("
s:%s and count:%d",s,count);}
void Islog2( char *s,int count){app_log("
s:%s and count:%d",s,count);}
void Islog3( char *s,int count){app_log("
s:%s and count:%d",s,count);} |
´òÓ¡µÄ½á¹ûÊÇ:
[0][TCP: main.c:
101] s:hello world! and count:1
[5][TCP: main.c: 102] s:hello world! and count:2
[9][TCP: main.c: 103] s:hello world! and count:3 |
2. »Øµ÷º¯Êý
¸ÅÄ»Øµ÷º¯Êý£¬¹ËÃû˼Ò壬¾ÍÊÇʹÓÃÕß×Ô¼º¶¨ÒåÒ»¸öº¯Êý£¬Ê¹ÓÃÕß×Ô¼ºÊµÏÖÕâ¸öº¯ÊýµÄ³ÌÐòÄÚÈÝ£¬È»ºó°ÑÕâ¸öº¯Êý×÷Ϊ²ÎÊý´«Èë±ðÈË£¨»òϵͳ£©µÄº¯ÊýÖУ¬ÓɱðÈË£¨»òϵͳ£©µÄº¯ÊýÔÚÔËÐÐʱÀ´µ÷Óõĺ¯Êý¡£º¯ÊýÊÇÄãʵÏֵ쬵«ÓɱðÈË£¨»òϵͳ£©µÄº¯ÊýÔÚÔËÐÐʱͨ¹ý²ÎÊý´«µÝµÄ·½Ê½µ÷Óã¬Õâ¾ÍÊÇËùνµÄ»Øµ÷º¯Êý¡£¼òµ¥À´Ëµ£¬¾ÍÊÇÓɱðÈ˵ĺ¯ÊýÔËÐÐÆÚ¼äÀ´»Øµ÷ÄãʵÏֵĺ¯Êý¡£ÔÙÀ´¿´¿´À´×ÔStack
Overflowijλ´óÉñ¼ò½àÃ÷Á˵ıíÊö£ºA ¡°callback¡± is any function that
is called by another function which takes the first
function as a parameter¡£ Ò²¾ÍÊÇ˵£¬º¯Êý FuncA µ÷Óú¯Êý FuncB)µÄʱºò£¬º¯Êý
FuncAͨ¹ý²ÎÊý¸ø º¯Êý FuncB´«µÝÁËÁíÍâÒ»¸öº¯Êý FuncC µÄÖ¸Õ룬ÔÚº¯Êý FuncB Ö´ÐеĹý³ÌÖУ¬º¯ÊýFuncB
µ÷ÓÃÁ˺¯Êý FuncC£¬Õâ¸ö¶¯×÷¾Í½Ð×ö»Øµ÷£¨Callback£©£¬¶øÏȱ»µ±×öÖ¸Õë´«Èë¡¢ºóÃæÓÖ±»»Øµ÷µÄº¯Êý
F3 ¾ÍÊǻص÷º¯Êý¡£µ½´ËÓ¦¸ÃÃ÷°×»Øµ÷º¯ÊýµÄ¶¨ÒåÁ˰ɣ¿
ÎÒÃǽ«Ò»¿ªÊ¼µÄhello worldº¯ÊýÐ޸ijɺ¯Êý»Øµ÷Ñùʽ£º
1. ¼òµ¥µÄ»Øµ÷º¯Êý
//¶¨Ò廨µ÷º¯Êý
void PrintText(){
app_log("hello world!");
}
//¶¨ÒåʵÏֻص÷º¯ÊýµÄ¡°µ÷Óú¯Êý¡±
void CallprintfText(void (*callfunc)()){
callfunc();
}
int application_start( void )
{
OSStatus err = kNoErr;
CallprintfText(PrintText);
return err;
}
|
´òÓ¡µÄ½á¹ûÊÇ:
[0][TCP: main.c:
82] hello world! |
2. ʹÓÃtypedefд·¨£º
typedef void
(*CallFunc)();
//¶¨Ò廨µ÷º¯Êý
void PrintText(){
app_log("hello world!");
}
//¶¨ÒåʵÏֻص÷º¯ÊýµÄ¡°µ÷Óú¯Êý¡±
void CallprintfText(CallFunc callfunc){
callfunc();
}
int application_start( void )
{
OSStatus err = kNoErr;
CallprintfText(PrintText);
return err;
}
|
´òÓ¡µÄ½á¹ûÊÇ:
[0][TCP: main.c:
82] hello world! |
3. Ð޸Ĵø²ÎÊýµÄ»Øµ÷º¯Êýд·¨
ÕâÀïÖ»·ÅÁËÒ»¸öÀàÐ͵IJÎÊý£¬ºÜÖØÒª£¡
void PrintText(char
*s){
app_log("s:%s",s);
}
//¶¨ÒåʵÏֻص÷º¯ÊýµÄ¡°µ÷Óú¯Êý¡±
void CallprintfText(void (*callfunc)(char*),char
*s){
callfunc(s);
}
int application_start( void )
{
OSStatus err = kNoErr;
CallprintfText(PrintText,"hello world!");
return err;
}
|
´òÓ¡µÄ½á¹ûÊÇ:
[0][TCP: main.c:
82] hello world! |
4. ʹÓÃtypedefд·¨£º
typedef void
(*CallFunc)(char *s,int count);
//¶¨Ò廨µ÷º¯Êý
void PrintText(char *s,int count){
app_log("s:%s",s);
app_log("count:%d",count);
}
//¶¨ÒåʵÏֻص÷º¯ÊýµÄ¡°µ÷Óú¯Êý¡±
void CallprintfText(CallFunc callfunc,char *s,int
count){
callfunc(s,count);
}
int application_start( void )
{
OSStatus err = kNoErr;
CallprintfText(PrintText,"hello world!",1);
return err;
}
|
´òÓ¡µÄ½á¹ûÊÇ:
[0][TCP: main.c:
84] s:hello world!
[3][TCP: main.c: 85] count:1 |
|