• C/C++函数指针声明


    前天看APUE,看到signal的声明竟然是

    void (*signal(int,void(*)(int)))(int);


    初看下面,还真是看不出这是啥意思。道行太浅,仅仅能看到这样的函数指针
    void *(*func)(int,void(*)(int));


    书中说先typedef下面就能看清楚这个指针
    typedef void Signfunc(int);
    Signfunc *signal(int,Sigfunc *);
    这样写的确变清晰了。但是搞不懂为啥应该是这么分析,为啥它不写成
    (void (int))(*signal)(int,void(*)(int));
    这么写不是更能看懂,然后我放到gcc里面编译,它说
    error: expected identifier or ‘(’ before ‘void’
     (void (int))(*signal)(int,void(*)(int));
    改了一下。又说:
    error: expected identifier or ‘(’ before ‘int’
     void (int)(*signal)(int x,void(*func)(int))
     error: ‘signal’ declared as function returning a function
     void (*signal)(int,void(*)(int))(int);
    error: ‘signal’ declared as function returning a function
     void ((*signal)(int,void(*)(int)))(int);
    看来它仅仅认这样的。真不知老美怎么想的,搞得这么难认。




    看来仅仅能用这样的规则套了:


    假设函数返回的不是函数指针。那么这个函数指针能够定义为例如以下形式:


    test的返回值 ( *test)(test的型參);
    假设返回的是函数指针。我们要写成:


    返回函数的返回值 (*test(test的參数))(返回函数的型參);


    然后能够组合成各种恐怖的函数声明


    void (*((*signal(int,void(*)(int)))(int,void(*)(int)))(int,void(*)(int));
    就是一个函数指针A。它返回的是一个函数指针B。这个B函数是一个返回函数C值针的函数。把复杂的參数先去掉,变成这样
    void (*((*signal(int))(int))(int);


    #include <stdio.h>
    
    
    void (*((*signal(int))(int)))(int);
    void (*fun(int))(int);
    void test(int);
    
    
    int main(int c, char ** v)
    {
    	signal(323);
    	return 0;	
    }
    
    
    void (*((*signal(int x))(int)))(int)
    {
    	printf("num:%d",x);
    	return fun;
    }
    
    
    
    
    void (*fun(int y))(int)
    {
    	return test;	
    }
    
    
    void test(int x)
    {
    	printf("fuck C function pointer!!!,%d",x);
    }


    我们还能够继续
    就是一个函数指针A,它返回的是一个函数指针B,这个B函数是一个返回函数C值针的函数。而函数C就是一个返回函数D指针的函数。。

    。。。。

    个人博客地址:http://www.flakor.cn

  • 相关阅读:
    C#异常断电后重新启动项目出现配置未初始化错误
    TFS: 解决The build agent error
    删除TFS中的项目
    将现有项目添加到TFS中
    Typora开启行内公式
    Markdown上下标内容多于一项
    小甲鱼python基础教程飞机大战源码及素材
    Git 将本地库添加到远程仓库
    C# float与UInt16互转
    C++的重载流输出运算符
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5143106.html
Copyright © 2020-2023  润新知