C'è qualche merito nell'usare 'unione' per creare un alias?

2

Ho ereditato un po 'di codice e ho visto qualcosa di nuovo. Hanno una definizione della struttura dei dati in un file .h, e in vari file locali dichiareranno:

union globalStructOstuff localVar;

C'è qualche merito a questo?

Ne vedevo alcuni se il globale era un segnaposto e alla fine le versioni locali sarebbero state diverse. Ma non è questo il caso qui.

Quindi penso che tutto ciò stia facendo sta causando ai nuovi ragazzi un paio di minuti in più alla ricerca di definizioni. L'avrei preso una volta sola, ma volevo vedere se mi mancava qualche altro scopo.

Modifica, risoluzione
Con il tuo aiuto, sono riuscito ad aprire gli occhi e realizzare globalStructOstuff non è affatto una struttura, è un'unione che contiene la struttura di un nome simile. E non hanno usato typedef. Quindi tutto ciò che sta accadendo qui sta dichiarando una variabile locale. Ha un tipo di unione. Nessun alias per qualcosa di globale. Scusa per la confusione, grazie per tutto il tuo aiuto.

    
posta Philip 12.10.2011 - 19:52
fonte

3 risposte

3

Sembra una dichiarazione di variabile.

In C dichiarare una variabile di una struct o union richiede la struct o union keyword (C ++ ha rimosso questo requisito).

La maggior parte delle persone usa un typedef per includere automaticamente la parola chiave nel nome del tipo, come ha fatto Blrfl nel suo esempio di codice.

    
risposta data 12.10.2011 - 23:05
fonte
2

Controlla attentamente l'utilizzo prima di rimuoverlo, perché ci sono alcune applicazioni che meritano l'uso di un costrutto la cui struttura interna può variare. Il fatto che sia un union e non un struct dice che questa potrebbe essere una di quelle situazioni. Cerca un campo comune a tutte le varianti del sindacato che viene utilizzato per indicare al codice che si riferisce ad esso quale accordo utilizzare nell'interpretazione dei contenuti.

La libreria lato client del sistema X Window utilizza questa tecnica per consentire ai messaggi evento ricevuti dal server di essere rilasciati direttamente in un sindacato e facilmente accessibili senza casting o altre cattiverie:

typedef struct {
        int type;               /* of event */
        unsigned long serial;   /* # of last request processed by server */
        Bool send_event;        /* true if this came from a SendEvent request */
        Display *display;       /* Display the event was read from */
        Window window;          /* "event" window it is reported relative to */
        /* ...etc... */
} XButtonEvent;


typedef union _XEvent {
        int type;               /* must not be changed; first element */
        XAnyEvent xany;
        XKeyEvent xkey;
        XButtonEvent xbutton;
        XMotionEvent xmotion;
        /* ...etc... */
} XEvent;
    
risposta data 12.10.2011 - 22:53
fonte
1

Alcuni IDE hanno un pannello o una finestra che elenca classi, strutture, ecc. e i loro membri per una rapida consultazione. Probabilmente, dichiarare un'unione in questo caso non ha altro scopo se non quello di far apparire la variabile in tale lista, o di cambiare come o dove è elencata da qualche strumento di documentazione. Altrimenti sembra inutile, ma poi le persone fanno cose strane per ragioni che solo loro sanno a volte.

    
risposta data 12.10.2011 - 20:40
fonte

Leggi altre domande sui tag