关于union赋值的一个问题,求助,谢谢!

sasoul 2007-10-24 11:07:37

int is_full;
void opt_show(..............);

typedef struct {
const char *name;
union {
void (*func_arg)(const char *);
int *int_arg;
char **str_arg;
float *float_arg;
int (*func2_arg)(const char *, const char *);
int64_t *int64_arg;
} u;
} type_new;

const type_new opt[] = {
{ "h", {(void*)opt_h} },
{ "f", {(void*)&is_full} },
{ NULL, },
};
求助2个问题:
1.函数opt_show定义返回值为void,那么(void*)opt_show} 怎么理解?(void*)应该是指针强制类型转换吧?
2.union的赋值问题。{ "h", {(void*)opt_show} }这个应该是对结构体数组opt的一个成员的赋值,相应的,{(void*)opt_show}应该是对结构体中的union成员赋值,这个不懂,找不到相关说明
找到的说明都说union的赋值只能通过引用其中的成员单个赋值。

感谢赐教!!
...全文
233 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouyh12345 2007-10-24
  • 打赏
  • 举报
回复
初始化和赋值是不同的行为
ouyh12345 2007-10-24
  • 打赏
  • 举报
回复
2、u的各成员都占用同一个地址,把它赋给了opt_show,
然后,这个地址可以转化成函数指针、int *、char **等
ouyh12345 2007-10-24
  • 打赏
  • 举报
回复
1、opt_show是一个函数的名字,(void*)opt_show就是取函数的地址,然后强制转化成void*
sasoul 2007-10-24
  • 打赏
  • 举报
回复
如果
int c = 1;
float d = 2.0;
union {
int a;
float b;
} u;
u.a = c;
或者u.b = d;
肯定可以
能不能直接
u = {c};然后编译器自动判断类型?
sasoul 2007-10-24
  • 打赏
  • 举报
回复
受教了~~~
只是还有些不懂的地方:
上面说到初始化和赋值是不同的行为,具体是什么意思呢?
比如一个变量a,
int a;
a = 1;//这叫初始化?
后来有
a = 2;//这叫赋值?

关于union
上面的代码中,关于union部分
是否一定程度上等价于:
union {
void (*func_arg)(const char *);
int *int_arg;
.........
} u = {(void*)opt_h} ;
这里有一个特殊的地方是union的成员都是指针
如果是
union {
void (*func_arg)(const char *);
int int_arg;//不是指针
.........
} u
还能用类似的方法赋值吗?比如
int a = 1;
union {
void (*func_arg)(const char *);
int int_arg;//不是指针
.........
} u = {a};

另外一个重要的问题,发帖有分是给回帖的吧,怎么给?


谢谢!!

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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