LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: realtang

使用函数指针pFun(x),(*pFun)(x)结果一样,为什么?

[复制链接]
发表于 2008-3-11 13:25:20 | 显示全部楼层
补充一个例子:
  1. #include <stdio.h>

  2. typedef char FUN (int);

  3. char
  4. glFun (int a)
  5. {
  6.   putchar (a);
  7.   putchar ('\n');
  8.   return a;
  9. }


  10. int
  11. main (int argc, char *argv[])
  12. {
  13.   FUN *pFun;
  14.   FUN **ppFun;

  15.   ppFun = &pFun;
  16.   *ppFun = glFun;

  17.   (*ppFun) ('A');                /* Valid: *ppFun is a pointer to function.  */
  18.   ppFun ('A');                   /* Error: ppFun is not a pointer to function.  */

  19.   return 0;
  20. }


复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-11 13:41:19 | 显示全部楼层
有道理,明白了,多谢herberteuler兄。
回复 支持 反对

使用道具 举报

发表于 2008-3-12 02:13:22 | 显示全部楼层
Post by herberteuler;1825216
这涉及到 C 的语义。由于现在的计算机教育往往从 C 开始,就忽视了对 C 的语义的理解而通过观察已有程序的例子从“表向”上去理解 C 如何工作。在大多数情况下这是可行的,但涉及到像这里所遇到的细节时就不得不回到语义上去。我下面的讨论以 C99 标准为背景,这份标准可以在 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf 下载到。



标准的 6.3.2.1 定义了 function designator 的概念:



上面的例子中 g1Fun 就是一个 function designator。

6.5.2 节定义了函数调用的限制和语义。6.5.2.1 节中说:



并且在脚注 77 中,标准明确地指出“大多数情况下这是转换一个是 function designator 的标识符得到的结果”。回到 realtang 的例子,



是不需转义的写法,因为 pFun 本身就是一个指向函数的指针的类型。后一种写法,以及下面 dajun 的写法:



其语义可以在 6.5.3.2 节找到:



即,(*pointer_to_func) 先被转换为 function designator,再转换成 pointer to function。当然,这些都是在编译时完成的。我也给出一个写法:

[Code]
#include <stdio.h>

typedef char FUN (int);

char
g1Fun (int a)
{
  putchar (a);
  putchar ('\n');
  return a;
}


int
main (int argc, char *argv[])
{
  FUN *pFun = g1Fun;

  pFun ('A');

  return 0;
}
[/Code]

堪称经典!:thank
PS,是注脚78,而不是77.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表