在C中返回一个联合,但让它看起来很漂亮

时间:2016-03-01 14:50:03

标签: c unions

所以,我有一个工会:

typedef union {
    int intVal;
    char charVal;
    bool boolVal;
} myUnion_t;

我有一个函数foo(与后一个联合文件在同一个文件中)将返回myUnion_t
我显然可以做到:

myUnion_t foo(int n){
    myUnion_t rtn;

    if(n == 0){
        rtn.intVal = 1;
    } else if(n == 1){
        rtn.charVal = 'b';
    } else {
        rtn.boolVal = false;
    }

    return rtn;
}

但这很混乱;我的CDO不喜欢它。有没有更好的方法来做到这一点,如:

myUnion_t foo(int n){
    if(n == 1){
        return 1;
    } else if(n == 2){
        return 'b';
    } else {
        return false;
    }
}

编辑:好的,工会本质上是凌乱的。感谢您的帮助,我将以正常方式执行此操作:)

1 个答案:

答案 0 :(得分:3)

虽然您无法返回union成员的值来代替union本身,但您可以使用compound literals of C99来避免在顶部声明union并设置它在初始化程序之外的字段:

typedef union object_t {
    int intVal;
    char charVal;
    _Bool boolVal;
} object_t;

object_t foo(char ch){
    switch(ch) {
        case 'a': return (object_t) { .intVal = 4 };
        case 'b': return (object_t) { .charVal = 'b' };
        default:  return (object_t) { .boolVal = true };
    }
}

您需要使用复合文字的原因是该类型本身不足以识别您希望分配的union成员。