Poche dichiarazioni C / C ++ insolite

-1

Mi sono imbattuto in queste dichiarazioni di Enum e Struct in un progetto presumibilmente fatto da un esperto. Le dichiarazioni / definizioni sono poco diverse da quelle finora utilizzate.

enum EnumKeys {
  KEY_MENU ,
  KEY_EXIT ,
  KEY_DOWN ,
  KEY_UP  ,
  KEY_RIGHT ,
.
.
.

};

Ma da nessuna parte nel codice l'enum effettivo è stato definito da una riga di codice come

 EnumKeys test; 

per esempio. Ma ancora KEY_MENU, KEY_EXIT sono disponibili gratuitamente subito dopo questa dichiarazione. Ad esempio, se digito cout << KEY_EXIT , stampa 1.

Un'altra istanza è, questa dichiarazione / definizione della struttura.

typedef struct t_ExpoData {
  int8_t  expNorm;
  int8_t  expDr;
  int8_t  drSw;
}ExpoData;

typedef struct t_ModelData {
  ...
  ...
  ExpoData  expoData[4]; // 3*4
}ModelData;

Quindi il modo in cui leggo questo è che c'è una nuova struttura con il nome ExpoData e una sua istanza è ExpoData. Invece di usare subito quell'istanza, perché la seconda dichiarazione ExpoData expoData[4] ?

Se qualcuno lo capisce, a partire da quale specifica clang è presente, e come interpretarlo correttamente, è molto apprezzato.

    
posta ABCD 08.08.2018 - 05:41
fonte

1 risposta

8

But nowhere in the code the actual Enum had been defined by something like EnumKeys test;

Per l'enumerazione, potrebbe non esserci mai alcuna dichiarazione di una variabile di quel tipo, ma potrebbe essere usata per creare altri valori. Spesso in C, i tipi enum sono combinati in int s o long s. Ad esempio, uno sviluppatore potrebbe scrivere:

int bitmask = KEY_UP | KEY_DOWN;

e quindi utilizzare quel valore in un confronto per verificare se è stato premuto il tasto freccia su o giù.

So the way I read this is, there is a new structure with the name ExpoData and one instance of it is ExpoData.

No, non è questo che significa. typedef in questo stile:

typedef struct <someName> {
    ... fields
} <somePossiblyOtherName>;

è una tipica definizione di tipo C. Hanno la forma:

typedef <existing type> <new type>;

Inoltre, le definizioni di C struct possono essere eseguite senza il typedef in questo modo:

struct <typeName> {
    ...fields
};

È quindi possibile utilizzare quel tipo digitando struct <typeName> prima di una dichiarazione di variabile, di un tipo restituito dalla funzione o di una funzione. In questo modo:

struct <typeName> functionName(struct <typeName> argument)

dove typeName è il nome del tipo.

Quindi, ciò che la definizione di tipo nel tuo codice dice è che stanno dichiarando un nuovo tipo che è un struct t_ExpoData e stanno dando al nuovo tipo il nome ExpoData . Salva gli utenti del tipo dal dover digitare struct t_ExpoData ogni volta che vogliono usarlo. Invece possono digitare solo ExpoData . Potrebbe essere stato scritto come 2 linee diverse come questa:

struct t_ExpoData {
    ... fields...
};
typedef struct t_ExpoData ExpoData;

Instead of using that instance right away, why the second declaration ExpoData expoData[4] ?

L'autore del codice dice che vogliono una matrice di 4 istanze di ExpoData nella loro struttura ModelData e vogliono che quel campo sia chiamato expoData . Dovresti accedervi in questo modo:

ModelData someModel;
someModel.expoData[0].expNorm = 5;
    
risposta data 08.08.2018 - 06:45
fonte

Leggi altre domande sui tag