[juliantec_list] Re: Re:Re: Re: 能有指向函数指针的指针么?

  • From: "Yihe Chen" <yihect@xxxxxxxxxxxxxx>
  • To: 张亮伟 <liangatzhang@xxxxxxx>, 蒋雨 <54jiangyu@xxxxxxxxx>
  • Date: Thu, 4 Aug 2011 09:46:31 +0800

谢谢了,原来就是和定义数据指针一样的说!

再多问一句,我们平时写代码的时候会用到
这么复杂的二重函数指针么?


有时候,如果需要一次性执行很多函数,但是
你又不知道这些函数的确切名字,或者不想让
这些函数的调用明显的出现在你的代码里面,
就可以用通过二重函数指针的方式来调用。

比较有名的例子,是在 linux 内核做初始化
的时候,它用二重函数指针来依次执行了很
多函数。在 .../init/main.c 文件中可以看
到下面这段代码:

extern initcall_t __initcall_start[], __initcall_end[], __early_initcall_end[];

static void __init do_initcalls(void)
{
       initcall_t *call;

       for (call = __early_initcall_end; call < __initcall_end; call++)
               do_one_initcall(*call);

       /* Make sure there is no pending stuff from the initcall sequence */
       flush_scheduled_work();
}

其中 initcall_t 是初始化函数指针的类型。
所有需要调用的初始化函数连续的存储在内存
里面,相当于构成了下面这样的一张表:
__________   <-- __initcall_start
__________
__________
__________   <-- __early_initcall_end
__________
__________
__________
__________
__________   <-- __initcall_end

而__initcall_start,__early_initcall_end,和
__initcall_end 是链接器通过链接脚本设置好的
三个位置指针,也就是我们说的二重函数指针。
这三个二重指针将表分成了两段。

上面函数中的循环,即是从 __early_initcall_end
开始,到 __initcall_end 结束,依次调用表
里面存储的每个函数(也就是 *call).


我感觉c语言的这种功能多少有点华而不实。
刚周围有人说从来不会去用来的。



Learning, Just As Your Favourite Thing!

Maillist, See http://www.juliantec.info/mlist/mail-lists.html
JulBlog, See http://www.juliantec.info/julblog/summary.php
JulWiki, See http://www.juliantec.info/wiki/




Other related posts: