2016-03-01 1 views
-2

Donc, j'ai un syndicat:Retour une union en C, mais le faire paraître belle

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

Et je fonction, foo, (dans le même fichier que l'union celui-ci) qui retournera myUnion_t .
je pouvais évidemment faire:

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

Mais c'est plutôt désordonné; mon CDO ne l'aime pas. Y at-il une plus belle façon de faire, quelque chose comme:

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

EDIT: D'accord, les syndicats sont par nature en désordre. Merci pour votre aide, je vais le faire de façon normale :)

+0

"Mais c'est plutôt désordonné" Malheureusement, les syndicats sont plutôt salissants tout seuls. – dasblinkenlight

+3

Qu'est-ce que "ceci" pour trouver un moyen plus facile? En passant, vous ne pouvez évidemment pas faire une telle chose et le 'object_t' comme type de retour et le type de variable locale devrait être' union object_t'. – MikeCAT

+2

'union object_t' et' object_t foo (... 'ne seront même pas compilés avec succès. 'Object_t' n'est pas défini Si vous compilez, vous utilisez un compilateur C++ Changez votre code ou le tag – Olaf

Répondre

3

Bien que vous ne pouvez pas retourner une valeur d'un membre union en place d'un union lui-même, vous pouvez utiliser compound literals of C99 pour éviter de déclarer la union en haut et l'établissement de ses champs en dehors initialiseur:

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

la raison pour laquelle vous devez utiliser un composé littéral est que le type lui-même ne suffit pas à identifier le membre d'un union que vous souhaitez attribuer.

+0

Aucune infraction, mais c'est encore plus compliqué. – Blacksilver

+1

@Blacksilver Le désordre est dans l'oeil du spectateur. Pour moi, c'est aussi propre que possible; Je préférerais certainement ceci à la définition des champs de 'output'. – dasblinkenlight

+0

Je veux rendre mon code * lisible *. si quelqu'un ne connaissait pas les littéraux composés, ils ne pourraient pas lire ceci. – Blacksilver