博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++函数指针声明
阅读量:7056 次
发布时间:2019-06-28

本文共 1444 字,大约阅读时间需要 4 分钟。

前天看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 
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://wdgol.baihongyu.com/

你可能感兴趣的文章
C++ 定义全局数组
查看>>
linux操作系统的目录以及用户权权限的管理
查看>>
GAN
查看>>
文件操作
查看>>
吃货联盟项目
查看>>
设计模式建造者
查看>>
基于XMPP实现的Openfire的配置安装+Android客户端的实现[转]
查看>>
android学习博客
查看>>
Linux下脚本实现交互输入
查看>>
Dapper 存储过程、事务等
查看>>
汇编语言-深入机器的内核
查看>>
Eclipse对于多个Java项目的支持并不友好!
查看>>
Pandas Series数据结构基本操作
查看>>
ubuntu桌面环境配置及切换
查看>>
oracle常用查询三
查看>>
码字定式之SQL(6)
查看>>
命名空间“Microsoft”中不存在类型或命名空间名“Reporting”(是否缺少程序集引用?)...
查看>>
【转】Scheme 编程环境的设置
查看>>
异常分类,异常抛出位置
查看>>
需求分析与原型设计
查看>>