了解代码片段

时间:2014-11-01 22:58:05

标签: c

我正在读一本书,没有在线代码参考,所以我不了解几件事情。 完整代码:

#include <stdio.h>
/* The API to implement */
struct greet_api    {
  int (*say_hello)(char *name);
  int (*say_goodbye)(void);
};
/* Our implementation of the hello function */
int say_hello_fn(char *name)    {
  printf("Hello %s\n", name);
  return 0;
}
/* Our implementation of the goodbye function */
int say_goodbye_fn(void)    {
  printf("Goodbye\n");
  return 0;
}
/* A struct implementing the API */
struct greet_api greet_api =     {
  .say_hello = say_hello_fn,
  .say_goodbye = say_goodbye_fn
};
/* main() doesn't need to know anything about how the
* say_hello/goodbye works, it just knows that it does */
int main(int argc, char *argv[])    {
  greet_api.say_hello(argv[1]);
  greet_api.say_goodbye();
  printf("%p, %p, %p\n", greet_api.say_hello, say_hello_fn, &say_hello_fn);
  exit(0);
}

我以前从未见过:

 int (*say_hello)(char *name);
 int (*say_goodbye)(void);

和:

struct greet_api greet_api =    {
  .say_hello = say_hello_fn,
  .say_goodbye = say_goodbye_fn
};

我很了解那里发生的事情,但正如我之前所说,我以前从未见过。

这些东西在第一个片段中是双括号。 第二个片段中的等号,点和函数名称没有括号。

如果有人可以发布一些好的文章或标题,那么我可以在网上查看,我会非常感激。

2 个答案:

答案 0 :(得分:3)

这些分别是function pointersdesignated initializers。没有括号的函数名称就是你将函数的地址存储在函数指针中的方式(在这种情况下&是兼容的)。

答案 1 :(得分:1)

前两个是函数指针(How do function pointers work)然后,作者通过指定的初始值设定项初始化这两个指针(检查this回答)。