2

我是怎么分析GIOchannel,glib源代码的。有人可以解释一下。

GSource * g_io_create_watch (GIOChannel   *channel,GIOCondition  condition){

  g_return_val_if_fail (channel != NULL, NULL);
  return channel->funcs->io_create_watch (channel, condition); //THIS LINE

}

上面的“THIS LINE”是什么意思?我试图找出它指向哪个函数,但不明白。该函数位于 glib 源代码的 giochannel.c 文件中。

提前致谢。

4

2 回答 2

2

GIO 库使用面向对象的技术,但使用纯 C 语言编写。

现在,重点:

  • channel: 是指向GIOChannel对象的指针。这很容易。
  • channel->funcs: 是指向该GIOChannel对象的虚拟表的指针。也就是说,指向函数的指针结构。这个想法是可能有几个实现GIOChannel,每个实现都有一个不同的函数表来实现那个特定的类。
  • channel->funcs->io_create_watch: 是该对象的g_io_create_watch函数的实现GIOChannel
  • return channel->funcs->io_create_watch (channel, condition):此表达式调用相关的给定虚函数并返回返回值。

如您所见,公共函数g_io_create_watch只是将调用转发到相应的虚函数。这是必要的,因为在 GObject 中,虚函数永远不会被认为是公共的,也就是说,客户端代码永远不应该直接调用它们。

要了解它是如何工作的,请查看其中一些函数的具体实现,例如,对于普通的 Unix 文件,请查看giounix.c文件,尤其是函数g_io_channel_unix_new和 struct unix_channel_funcs

于 2013-06-28T22:28:01.363 回答
0

看起来它返回了一个指向 GSource 类型的指针,它看起来是一个函数指针。

于 2013-06-28T22:08:33.807 回答