2016-03-01 29 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

相關問題