2016-06-07 14 views
-3

Ist es zulässig, eine Funktion wie die eines benutzerdefinierten Datentyps mit enum in C zu benennen? Beispiel:Name eines Funktionsrückgabetyps als Name des Benutzers Datentyp definieren

enum sentence_id sentence_id(const char *sentence, bool strict); 

und ENUM sentence_id unterhalb

enum sentence_id { 
MINMEA_INVALID = -1, 
MINMEA_UNKNOWN = 0, 
MINMEA_SENTENCE_RMC, 
MINMEA_SENTENCE_GGA, 
MINMEA_SENTENCE_GSA, 

}; 

Ist es für andere Benutzer definierten Datentyp (wie Struktur), wie angegeben definiert?

+8

Bitte wählen Sie eine Sprache. – MikeCAT

+1

Es ist eine Funktion, die den definierten Typ zurückgibt. Sowohl der Typ als auch die Funktion wurden identisch benannt. Es funktioniert in C, aber es ist eine schlechte Idee, Identifikatoren zu duplizieren. –

+0

Es gibt keine Erwartung, wenn Sie es verstehen, da es einfach ungültiger C# -Code ist. Bitte klären Sie, wonach Sie suchen. –

Antwort

1

Das sieht nur seltsam, weil die Kennung für die Zählung und die Funktion identisch ist, was möglich ist, weil eine Aufzählung Kennung immer ein enum Schlüsselwort zu folgen und ein enum immer durch eine Kennung gefolgt.

Also lassen Sie uns ihnen verschiedene Namen geben:

enum minmea_sentence_id_e 
{ 
… 
}; 

Dies definiert eine Aufzählung mit dem Namen minmea_sentence_id_e.

Die Funktion bekommt eine andere Kennung, auch:

enum minmea_sentence_id_e minmea_sentence_id_f(const char *sentence, bool strict); 

Nun sollte es klar sein, dass es eine Funktion minmea_sentence_id_f Rückkehr einen Wert von Enumeration namens minmea_sentence_id_e genannt wird.

+0

@JoshCaswell Thx –

0

Ich verstehe nicht, die Bedeutung dieser Aussage

Also gehe ich davon aus das nicht Ihr Code. Mal sehen, was der andere schrieb:

enum minmea_sentence_id { ... }; 

In (objektiv-) C dies einen Aufzählungstyp erklärt, minmea_sentence_id, die durch das Vorsetzen der Namen mit enum verwendet wird. So zum Beispiel:

enum minmea_sentence_id mySentenceID; 

deklariert eine Variable vom Typ enum minmea_sentence_id namens mySentenceID.

Beachten Sie, dass, wenn man statt der oben sie geschrieben hatte:

minmea_sentence_id mySentenceID; 

aber sie:

typedef enum { ... } minmea_sentence_id; 

dann minmea_sentence_id selbst einen Typnamen und dem obigen Beispiel Erklärung wäre nur gewesen wäre, habe das nicht gemacht, also brauchst du den enum wenn du den Typ benutzt.

Warum wird es zweimal wiederholt?

Sie schrieben die Funktionsdeklaration:

Enum minmea_sentence_id minmea_sentence_id (const char * Satz, Bool streng);

Das erste Element in einer Funktionsdeklaration ist der Rückgabetyp und von der oben wissen wir, dass die ersten beiden Token enum minmea_sentence_id ist.

Als nächstes kommt der Name der Funktion deklariert, minmea_sentence_id, die seltsam aussieht - Benennung einer Funktion die gleiche wie ein Typ - aber ist überhaupt nicht illegal, obwohl normalerweise stark davon abgeraten, da es Code viel schwerer zu lesen macht!

Deshalb wird es zweimal wiederholt, aber warum haben sie das getan?

Wir können nur vermuten, aber (objektiv-) C++ unterstützt funktions Casts, zB:

int x = (int)expo; // valid in (Objective-)C(++) 
int y = int(expr); // valid in (Objective-)C++ and NOT in (Objective-)C 

Betrachten wir nun, was ein Aufruf an die minmea_sentence_id Funktion wie folgt aussieht:

enum minmea_sentence_id mySentenceID = minmea_sentence_id("my sentence", TRUE); 

ein bisschen wie eine Funktion-Stil Besetzung. Vielleicht dachten sie das, aber es ist nur eine Vermutung!

HTH

+0

deklariert werden sollte Sie :-) –