2016-03-01 52 views
-2

所以,我有一个联盟:返回工会在C,但使它看起来不错

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; 
    } 
} 

编辑:好吧,工会本身是混乱的。感谢您的帮助,我只是做了正常的方式:)

+0

“但是这相当混乱”不幸的是,工会自己都相当混乱。 – dasblinkenlight

+3

什么是“这”找到一个更简单的方法?顺便说一句,你显然不能做这样的事情,'object_t'作为返回类型和局部变量的类型应该是'union object_t'。 – MikeCAT

+2

'union object_t'和'object_t foo(...'甚至不能成功编译,'object_t'没有定义,如果它编译的话,你可以使用C++编译器,或者更改你的代码或标签。 – Olaf

回答

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,你想被分配的成员。

+0

没有冒犯,但这更加混乱。 – Blacksilver

+1

@Blacksilver混乱是在旁观者的眼中。对我来说,这是一样干净的,我一定会喜欢这个来设置'output'的字段。 – dasblinkenlight

+0

我想让我的代码*可读*。如果有人不知道复合文字,他们将无法阅读。 – Blacksilver

相关问题