union的妙用

逍遥云 posted @ 2011年1月11日 06:12 in c/c++ with tags c c++ struct union , 8769 阅读

先前看了SDL的SDL_Event, 不大明白其中的用法,后来翻了翻书中关于union的用法,再则看到了云风的这篇文章C 语言中统一的函数指针, 就写了一个不成文的例子, 把union作为函数的参数传递, 可以将两个毫不相干的不同类型的结构数据粘合在一起, 的确很有意思.


#include <stdio.h>
#include <stdlib.h>

typedef enum bool {false, true} bool;

typedef struct Number {
    unsigned char type;
    unsigned int num;
    bool sign;
} Number;

typedef struct OP {
    unsigned char type;
    char ch;
} OP;

typedef union Button {
    unsigned char type;
    Number num;
    OP op;
} Button;

void printNum(int num)
{
    printf("Print Number:%d\n", num);
}

void printOP(char op)
{
    printf("Print Op:%c\n", op);
}

void cal(Button p)
{
    switch(p.type)
    {
        case 1:
            printNum(p.num.num * ((p.num.sign) ? 1 : -1));
            break;
        case 2:
            printOP(p.op.ch);
            break;
    }
}


int main()
{
    Button p1;
    p1.num = (Number) {1, 9, false};
    cal(p1);

    p1.op = (OP) {2, '='};
    cal(p1);

    exit(0);
}

这里要注意结构体的第一个字段一定要与union的第一个字符对应起来, 至于为什么, 去翻看union用法吧...

 

Avatar_small
ownwaterloo 说:
2011年1月11日 22:09

云风又犯傻了……
C语言本来就有"统一的函数指针", 任何一种函数指针都是。

Avatar_small
翻墙砖家 说:
2011年1月16日 03:14

@ownwaterloo: 为什么要说“又”呢。。。。cool

Avatar_small
ownwaterloo 说:
2011年1月16日 07:21

@翻墙砖家:
因为他"经常"啊。
说个最出名的吧, 在《游戏之旅》中,6.2.2 低效的静态变量 141页

同样的道理,临时构造一个对象,
使用系统提供的new操作间接地调用了malloc是一种低效的操作;
注重效率的做法是一个placement new,
而改用alloca在堆栈中分配对象需要的空间,
然后在退出函数时直接调用对象的析构函数,
而不是delete方法,
让函数退出时的堆栈调整操作自动回收内存。

才看到这段时, 我自己都被忽悠了。
回过头再看才发现犯二了……

Avatar_small
sunus 说:
2011年3月22日 01:36

^^这blog挺有意思
mark一下..
这里不能加好友啊 可惜了><


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter