看到这种函数声明,使我失去继续学下去的信心

0黄瓜0 2005-11-18 09:39:45
void ( *signal( int sig, void (__cdecl *func) ( int sig [, int subcode ] )) ) ( int sig );

...全文
544 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yeehya 2005-11-18
  • 打赏
  • 举报
回复
void ( *sighandler_t)(int sig);//这是一个函数指针.
sighandler_t指向的函数signal的一个参数也是是函数指针void (__cdecl *func)(int sig [,int subcode]) [ ]内说明是可选参数吧~
ah__fu 2005-11-18
  • 打赏
  • 举报
回复
int sig [, int subcode ]
这个是什么?
楼主应该是从什么说明文档上COPY下来的,C中是不会有这样的声明的,这里应该是:
( int sig, int subcode = 0 )




====CSDN 小助手 V2.0 2005年10月16日发布====
CSDN小助手是一款脱离浏览器也可以访问Csdn论坛的软件
界面:http://blog.csdn.net/Qqwwee_Com/archive/2005/10/16/504620.aspx
下载:http://szlawbook.com/csdnv2/csdnv2.rar
力为 2005-11-18
  • 打赏
  • 举报
回复
习惯成自然,呵呵
code8238 2005-11-18
  • 打赏
  • 举报
回复
声明一个函数指针,他的返回值也是一个函数指针,并且这个返回值得参数表里也有一个函数指针
不知道我分析的对不对!
0黄瓜0 2005-11-18
  • 打赏
  • 举报
回复
哇,CSDN 的朋友们就是热心,一个抱怨这么多人,耐心讲解。谢谢!谢谢!

这是C异常处理中涉及到的函数,在<signal.h>中声明为
_CRTIMP void (__cdecl * __cdecl signal(int, void (__cdecl *)(int)))(int);

CSDN中说名为
void ( *signal( int sig, void (__cdecl *func) ( int sig [, int subcode ] )) ) ( int sig );

///结贴, 可惜分太少 //


再次 谢谢!
megaboy 2005-11-18
  • 打赏
  • 举报
回复
所有说signal是一个函数指针的都是错的,signal不是函数指针,而是函数名,这个函数有两个形参,一个是int,另一个是函数指针,这个函数指针指向的函数返回值为void,具有两个int形参,调用方式为_cdecl,signal函数的返回值是一个函数指针,这个函数指针所指向的函数返回值为void,形参为int。


另:给楼主一点忠告,逃避不是办法,你迟早要面对它,投降只能证明你的懦弱,是男人就克服它。
huwei001982 2005-11-18
  • 打赏
  • 举报
回复
是函数指针, 挺烦人的, 呵呵
nwpulipeng 2005-11-18
  • 打赏
  • 举报
回复
都是高手!呵呵
Mr_Yang 2005-11-18
  • 打赏
  • 举报
回复
都说的差不多了。
cqpp 2005-11-18
  • 打赏
  • 举报
回复
函数可以有void类型的参数吗?
void (*signal(int,void))(int sig);
hbyufan 2005-11-18
  • 打赏
  • 举报
回复
同意 binbin(破坏分子)
moonfkypm 2005-11-18
  • 打赏
  • 举报
回复
signal是函数指针
所以调用的时候可以正常方式 (*signal)(...)调用
也可以省略写法signal(...)调用
binbin 2005-11-18
  • 打赏
  • 举报
回复
再简化一次,上面的声明可以等于下面的代码:

typedef void (__cdecl *pFunc1) ( int sig , int subcode );
typedef void (*pFunc2)(int sig);
pFunc2 signal( int sig, pFunc1);
binbin 2005-11-18
  • 打赏
  • 举报
回复
这可能是参考手册或教科书上对函数的说明,[]一般指这个部分是可选的,在实际的程序中是不会出现的,其实[]作为可选参数是大多数参考手册和教科书上的惯用法,不只是在C/C++语言中,现在再拿这个声明来说(假设使用这个可选参数):
void ( *signal( int sig, void (__cdecl *func) ( int sig , int subcode )) ) ( int sig );

void (__cdecl *func) ( int sig , int subcode )是一个函数指针,接受两个整型参数,无返回值,传参数和清理栈的方式是cdecl,即从右向左压入参数,调用者清栈
为了方便理解,我们把这个函数指针定义为一个自定义数据类型:
typedef void (__cdecl *pFunc) ( int sig , int subcode );

现在,原来的声明可以简化为:
void ( *signal( int sig, pFunc) ) ( int sig );
这样看来*signal( int sig, pFunc)部分是一个函数指针,这个指针指向的函数有一个整型参数,无返回值.由此可以知道这个函数指针是由signal函数返回的,而signal函数的参数有两个,一个是整型,另一个就是上面我们定义的pFunc,即另一个函数指针.

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧