函数指针

sxaxax 2012-07-13 02:44:50
第二次发帖,怕怕的。。。

#include <stdio.h>

typedef void(*func)(int);
typedef int(*func2)(int);

struct func_pointer {
int i;
union {
func func;
func2 func2;
} function;
};

void print(int s)
{
printf("%d: ", s);
printf("This is a demo of function pointer!\n");
}

int print2(int s)
{
printf("%d: ", s);
printf("This is the second demo of function pointer!\n");

return 0;
}

int main (int argc, char *argv[])
{
int i;

#if 0
/* Define a function pointer array */
struct func_pointer a[] = {
{1, print},
{2, print},
{3, print},
};
#endif
printf("sizeof(struct func_pointer): %d\n", sizeof(struct func_pointer));
struct func_pointer a = {1, {print}};
struct func_pointer b = {2, {print2}};

for (i = 0; i < sizeof(a) / sizeof(struct func_pointer); i++)
{
a.function.func(i);
b.function.func2(i);
}

return 0;
}

编译的时候提示initialization from incompatible pointer type,搞不明白,求助大家哈。。。
...全文
149 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxaxax 2012-07-13
  • 打赏
  • 举报
回复
谢谢,不过那样做在gcc下不报错,所以不知道编译器是怎么处理的。[Quote=引用 2 楼 的回复:]

C/C++ code

struct func_pointer b = {2};
b.function.func2 = print2;



对union初始化可以有两个途径:
1.在声明union变量的同时进行初始化。此时,初始化成员时必须针对第一个成员变量来初始化。
2.在声明union变量之后,再对该变量进行初始化。
[/Quote]
sxaxax 2012-07-13
  • 打赏
  • 举报
回复
懂了,谢谢![Quote=引用 1 楼 的回复:]

参考:
函数指针的几种用法
[/Quote]
sxaxax 2012-07-13
  • 打赏
  • 举报
回复
gcc编译的。[Quote=引用 5 楼 的回复:]

楼主是用C方式编译的吗?


struct func_pointer a = {1, {print}};
struct func_pointer b = {2, {print2}};

放在 int i的下面试试
[/Quote]
王大狼山 2012-07-13
  • 打赏
  • 举报
回复
楼主是用C方式编译的吗?


struct func_pointer a = {1, {print}};
struct func_pointer b = {2, {print2}};

放在 int i的下面试试
adler 2012-07-13
  • 打赏
  • 举报
回复
这个正解[Quote=引用 2 楼 的回复:]
C/C++ code

struct func_pointer b = {2};
b.function.func2 = print2;



对union初始化可以有两个途径:
1.在声明union变量的同时进行初始化。此时,初始化成员时必须针对第一个成员变量来初始化。
2.在声明union变量之后,再对该变量进行初始化。
[/Quote]
W170532934 2012-07-13
  • 打赏
  • 举报
回复
先看下这个吧。
http://www.velocityreviews.com/forums/t443667-intializing-struct-containing-an-union.html
其实楼主的代码基本没有什么错误。但是对于struct内部的union只能初始化第一个。所以报错:error C2440: “初始化” : 无法从“int (__cdecl *)(int)”转换为“func”
你只需要把你的那个b变量注视掉吧。对于union里面非第一个变量,没办法进行直接初始化
www_adintr_com 2012-07-13
  • 打赏
  • 举报
回复

struct func_pointer b = {2};
b.function.func2 = print2;


对union初始化可以有两个途径:
1.在声明union变量的同时进行初始化。此时,初始化成员时必须针对第一个成员变量来初始化。
2.在声明union变量之后,再对该变量进行初始化。
pathuang68 2012-07-13
  • 打赏
  • 举报
回复

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧