前天看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/C++函数指针声明的更多相关文章

  1. C语言复杂的函数指针声明

    复习C语言ING,发现复杂的函数指针声明看不懂,百度半天终于略知一二. 讲的比较详细的一篇blog: http://blog.csdn.net/megaboy/article/details/4827 ...

  2. 详解C/C++函数指针声明 ( *( void(*)())0)();

     ( *( void(*)())0)(); float *pf; 这个声明的含义是*pf是一个浮点数,也就是说,pf是一个指向浮点数的指针. float *g() , (*h)(); 表示*g()与( ...

  3. 详解C/C++函数指针声明

    要理解一个C程序,仅仅理解组成该程序的符号是不够的.程序员还必须理解这些符号是如何组合成声明.表达式.语句和程序的. 我们先来看看下面的一个语句: 1 ( *( void(*)())0)(); 这是当 ...

  4. 关于C/C++函数指针声明的理解

    [前言] 由于最近对函数指针的理解比较模糊,所有又重新学习了一把关于函数指针的知识,参考了很多书籍和网上的文章.现在本人进行一下分享和总结.本文的其实只是整理和总结别人现有的文章,作为备用参考文档. ...

  5. C/C++中的成员函数指针声明及使用

    代码: #include <iostream> using namespace std; class Test{ public: void func(){ cout<<&quo ...

  6. QT中使用函数指针

    想仿命令行,所以定义了一个类,让一个String 对应一个 function,将两者输入list容器. 类中定义了 QString commandStr; void (MainWindow::*com ...

  7. 谈谈自己对C语言中函数指针的一些理解 (第一次写博客,有点小兴奋哈)

    1.函数指针声明的格式及简单的使用 (1)格式:(返回值)(*函数指针名)(参数列表)    例如:声明一个无参数无返回值的函数指针(void)(*p)(void). (2)将函数指针指向某个无参数无 ...

  8. 函数指针_typedef

    一 函数指针 1 函数类型 函数的类型由它的返回值类型,和形参类型共通过决定,与函数名无关. eg:bool lengthcompare(const string&, const string ...

  9. 【转载】C/C++ 函数指针 总结

    转载自:http://blog.csdn.net/shihui512/article/details/9787125 什么是函数指针函数指针的声明函数指针的赋值函数指针的使用将函数作为其他函数的参数在 ...

随机推荐

  1. RequestMapping、Responsebody、RequestBody

    预备知识:@RequestMappingRequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径.@RequestM ...

  2. Pycharm 的安装

    一. Windows 安装 汉化 破解补丁激活 下载 `https://pan.baidu.com/s/1qjI9uHaw0x374rwu6H8djA` 并将 JetbrainsCrack-2.8-r ...

  3. Python正则表达式初识(六)

    继续分享Python正则表达式基础,今天给大家分享的正则表达式特殊符号是“[]”.中括号十分实用,其有特殊含义,其代表的意思是中括号中的字符只要满足其中任意一个就可以.其用法一共有三种,分别对其进行具 ...

  4. 【Docker基本操作】

    关于镜像的操作 docker search centos 搜索所有centos的镜像 docker pull centos 获取centos镜像 docker images 或 docker imag ...

  5. Reference Counting GC (Part one)

    目录 引用计数法 计数器值的增减 new_obj()和update_ptr()函数 new_obj()生成对象 update_ptr()更新指针ptr,对计数器进行增减 优点 可即可回收垃圾 最大暂停 ...

  6. 今日SGU 5.17

    SGU 119 题意:给你一个0-15组成的4*4的矩形,问你能不能回到正常 收获:把矩形变成一维数组,然后判断当前矩形状态到目标状态(逆序对为15)逆序对和0到目标的奇偶性是否不相同,证明题,引荐大 ...

  7. Linux下安装Go环境

    登录Linux Mac或Linux的用户可以用命令ssh root@xxx.xxx.xxx.xxx登录主机Window的用户可以使用SecureCRT登录主机虚拟机用户直接打开你的虚拟机 安装Go环境 ...

  8. C++中的指针、数组指针与指针数组、函数指针与指针函数

    C++中的指针.数组指针与指针数组.函数指针与指针函数 本文从刚開始学习的人的角度,深入浅出地具体解释什么是指针.怎样使用指针.怎样定义指针.怎样定义数组指针和函数指针.并给出相应的实例演示.接着,差 ...

  9. C++ 递归位置排列算法及其应用

    废话不多说,我们先看一下位置排序的算法: #include <iostream> using namespace std; int n = 0; int m = 2; int l = 0; ...

  10. jquery15 on() trigger() : 事件操作的相关方法

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...