LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: 月魄孤魂

能实现( f() )() 吗?

[复制链接]
发表于 2009-4-22 14:06:08 | 显示全部楼层
主函数里要这样:
int * (* f)(void) = a;
f();

编译警告,但可以运行。
因为子函数声明的返回值是指向整形的指针,而子函数里返回的却是函数指针,不匹配。
完整修改:
#include "stdio.h"

void * a(void);
void * b(void);
void * c(void);

int main(void)
{
void * (* f)(void) = a;
f();
f = b;
f();
return 0;
}

void * a(void)
{
printf("This is the 'a' function.\n");
return b;
}

void * b(void)
{
printf("This is the 'b' function.\n");
return c;
}

void * c(void)
{
printf("This is the 'c' function.\n");
return a;
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-4-22 17:13:40 | 显示全部楼层
我说的是要实现这样:“ ( f() )(); ”,一个表达式实现两次函数调用,其他都是次要的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-4-22 17:28:56 | 显示全部楼层
Post by khc;1977862
你函数指针的定義方法錯了

那该怎样定义?

Post by beyes;1977888
主函数里要这样:
int * (* f)(void) = a;
f();

编译警告,但可以运行。
因为子函数声明的返回值是指向整形的指针,而子函数里返回的却是函数指针,不匹配。
完整修改:
#include "stdio.h"

void * a(void);
void * b(void);
void * c(void);

int main(void)
{
void * (* f)(void) = a;
f();
f = b;
f();
return 0;
}

void * a(void)
{
printf("This is the 'a' function.\n");
return b;
}

void * b(void)
{
printf("This is the 'b' function.\n");
return c;
}

void * c(void)
{
printf("This is the 'c' function.\n");
return a;
}

我说的是要实现这样:“ [color="Red"]( f() )(); ”,一个表达式实现两次函数调用,其他都是次要的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-4-22 17:50:19 | 显示全部楼层
再说明下,我早就已经实现了这样了:
#include "stdio.h"

void * a(void);
void * b(void);
void * c(void);

int main(void)
{
void * (* f)(void) = a;
f=f();
f=f();
f=f();
f=f();
return 0;
}

void * a(void)
{
printf("This is the 'a' function.\n");
return b;
}

void * b(void)
{
printf("This is the 'b' function.\n");
return c;
}

void * c(void)
{
printf("This is the 'c' function.\n");
return a;
}

运行输出:
This is the 'a' function.
This is the 'b' function.
This is the 'c' function.
This is the 'a' function.

就是 “ [color="Red"]( f() )(); ”,实现不了。
回复 支持 反对

使用道具 举报

发表于 2009-4-22 19:09:43 | 显示全部楼层
简便起见,头部先声明一个:
typedef void *(*FunPoint)();

主函数:
int main()
{
FunPoint f = a;

((FunPoint)(f()))();

return 0;
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-4-22 19:46:28 | 显示全部楼层
Post by beyes;1978066
简便起见,头部先声明一个:
typedef void *(*FunPoint)();

主函数:
int main()
{
FunPoint f = a;

((FunPoint)(f()))();

return 0;
}

搞定!楼上乃高手也!原来必须要强制类型转换。谢了。

OK。再嵌套多一层
typedef void *(*FunPoint)();

主函数:
int main()
{
FunPoint f = a;

((FunPoint)(((FunPoint)(f()))()))();

return 0;
}

成功输出:
This is the 'a' function.
This is the 'b' function.
This is the 'c' function.
回复 支持 反对

使用道具 举报

发表于 2009-4-23 04:39:30 | 显示全部楼层
主要問題是你的 a, b, c 都不是在返回函数指针:
  1. static void g()
  2. {
  3. }
  4. static void (*f(void)) () /* typedef void (*cb)(void) */
  5. {
  6.     return g;
  7. }
  8. int main(int argc, char *argv[])
  9. {
  10.     f()();
  11.     return 0;
  12. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2009-4-29 19:12:08 | 显示全部楼层
Post by khc;1978242
主要問題是你的 a, b, c 都不是在返回函数指针:


  1. static void g()
  2. {
  3. }

  4. static void (*f(void)) () /* typedef void (*cb)(void) */
  5. {
  6.     return g;
  7. }

  8. int main(int argc, char *argv[])
  9. {
  10.     f()();
  11.     return 0;
  12. }
复制代码



这才是重点,原来的((FunPoint)(f()))();语句只是进行强制类型转换,即把普通指针转换为函数指针,如果按照楼上的做法,函数直接返回函数指针,这样的话就不在需要强制类型转换了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-3 12:02:58 | 显示全部楼层
Post by hougollen;1981231
这才是重点,原来的((FunPoint)(f()))();语句只是进行强制类型转换,即把普通指针转换为函数指针,如果按照楼上的做法,函数直接返回函数指针,这样的话就不在需要强制类型转换了
发现如果不用强制类型转换很难实现任意多个括号的 f()()()()… ,因为不能声明一个返回值类型是它自己本身的函数指针。

大家不用强制类型转换来试试f()()()就知道了,要实现它就必须要声明三个嵌套层次的函数指针。
回复 支持 反对

使用道具 举报

发表于 2009-5-4 02:37:39 | 显示全部楼层
不用强制转换也可以做到,返回值是重点。
gcc 4.3.3 下编译通过。

#include "stdio.h"

#define FUN_MAGIC(x, fun) fun (*x)()

typedef void * (*function)();

function a(void);
function b(void);
function c(void);

int main(void)
{
    FUN_MAGIC(f, function);
    f = a;
    f()();
    return 0;
}

function a(void)
{
printf("This is the 'a' function.\n");
return b;
}

function b(void)
{
printf("This is the 'b' function.\n");
return c;
}

function c(void)
{
printf("This is the 'c' function.\n");
return a;
}
回复 支持 反对

使用道具 举报

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

本版积分规则

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