打印
[AVR单片机]

发现:GCC中函数或函数指针 fun()=(*fun)()

[复制链接]
1458|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ATmega16|  楼主 | 2007-6-6 16:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <stdint.h>
#include <stdio.h>


typedef        void (*FVOID_t)(void) ;

typedef        int (*FINT_t)(char *) ;



void f_0(void){printf("void f_0(void) ");}
void f_1(void){printf("void f_1(void) ");}
void f_2(void){printf("void f_2(void) ");}
void f_3(void){printf("void f_3(void) ");}


int F_0(char * str){int n=printf(str);printf(" ");return n;}
int F_1(char * str){int n=printf(str);printf(" ");return n;}
int F_2(char * str){int n=printf(str);printf(" ");return n;}
int F_3(char * str){int n=printf(str);printf(" ");return n;}




FVOID_t FVOID_ARRY_RAM[4]                     ={f_0,f_1,f_2,f_3};

FINT_t FINT_ARRY_RAM[4]                     ={F_0,F_1,F_2,F_3};

int main(void)
{
        uint16_t temp;
        FVOID_t fun_void;
        FINT_t  fun_int;

        (&f_0)();
        f_0();
        (*f_0)();
        (**f_0)();
        (************************************f_0)();


        temp= (&F_0)("temp= (&F_0)(char *)");
        temp= F_0("temp= F_0(char *)");
        temp= (*F_0)("temp= (*F_0)(char *)");
        temp= (**F_0)("temp= (**F_0)(char *)");
        temp= (**********************************F_0)("temp= (**********************************F_0(char *)");



        fun_void=0;
        fun_void=FVOID_ARRY_RAM[0];
        if(fun_void!=0)
        {
//        (&fun_void)();  //错误
        fun_void();
        (*fun_void)();
        (**fun_void)();
        (************************fun_void)();

//        (&FVOID_ARRY_RAM[0])();  错误
        FVOID_ARRY_RAM[0]();
        (*FVOID_ARRY_RAM[0])();
        (**FVOID_ARRY_RAM[0])();
        (************************************FVOID_ARRY_RAM[0])();
        }



        fun_int=0;
        fun_int=FINT_ARRY_RAM[0];
        if(fun_int!=0)
        {        
                temp=fun_int("temp=fun_int(char *)");
                temp=(*fun_int)("temp=(*fun_int)(char *)");
                temp=(**fun_int)("temp=(**fun_int)(char *)");
                temp=(************************fun_int)("temp=(************************fun_int)");

                temp=FINT_ARRY_RAM[0]("temp=FINT_ARRY_RAM[0](char *)");
                temp=(*FINT_ARRY_RAM[0])("temp=(*FINT_ARRY_RAM[0])(char *)");
                temp=(**FINT_ARRY_RAM[0])("temp=(**FINT_ARRY_RAM[0])(char *)");
                temp=(*********************************FINT_ARRY_RAM[0])("temp=(*********************************FINT_ARRY_RAM[0])(char *)");
                
        }


while(1);

}
//编译器为MinGW/GCC3.4.5
/*
结论:
GCC中函数指针或者函数fun,则fun()等效于(*fun)(),由此进一步得到:
fun()=(*fun)()=(**fun)()=(***fun)()=(****fun)()=(*****fun)()=(******fun)()=……………………
如果fun是函数名,还有fun()=(&fun)()
*/ 

相关帖子

沙发
computer00| | 2007-6-6 16:52 | 只看该作者

好象任何C编译器都如此。

&fun,*fun,**fun,*...*fun都是同一个东西。

使用特权

评论回复
板凳
lzp3520265| | 2013-10-10 20:09 | 只看该作者
computer00 发表于 2007-6-6 16:52
&fun,*fun,**fun,*...*fun都是同一个东西。

C标准就是这么规定的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

109

主题

229

帖子

0

粉丝