2017-06-23 3 views
-3

Erläuterung Die Variablen, die auf alle Nullen gesetzt sind, sind der Fall, in dem sie bricht. Die enums mit den Werten in Kommentaren funktioniert gut.Wann wird die aufgezählte Variable in C++ ausgewertet?

Dies ist eine Vereinfachung meines Codes, das Problem ist, dass die "enum error" erhalten. Die Frage, die ich habe ist, wann werden die Enums bewertet? Außerdem kann ich am besten Entezahlen im Ganzen verstehen, also sollte eine Enumerationsvariable auf 0 als falsch bewertet werden und niemals den Wurf erreichen, wenn ich sie alle auf Null setze.

enum var_types//Set all to 0 to disable 
{ 
    VAR1 = 0x0, //var1 = 0x1 
    VAR2 = 0x0, //var2 = 0x2 
    VAR3 = 0x0, //var3 = 0x3 
    VAR4 = 0x0, //var4 = 0x4 
    VAR_NONE =0x0 //disabled = 0x0 
}; 


func(int var){ 
    if(var){ 
    if(var==VAR1){ cout << VAR1 << endl;} 
    else if(var==VAR2){ cout << VAR2 << endl;} 
    else if(var==VAR3){ cout << VAR3 << endl;} 
    else if(var==VAR4){ cout << VAR4 << endl;} 
    else {throw job_error("enum error");} 
    } 
//doing other things... 
} 

func(VAR1); 
func(VAR2); 
func(VAR3); 
func(VAR4); 
func(VAR_NONE); 

Motivation für den Code ist schnell zahlreiche Auswertung der „if“ Anweisung in einer Vielzahl von Anrufen auf die Funktion von einem einzigen Platz an der Spitze des Codes zu deaktivieren, während auch einzeln sie zum Sperren ermöglicht. Es gibt ungefähr 15 Aufrufe von "func" in Code, der über 1200 Codezeilen verteilt ist. Die Nullstellung der Enums ist eine bequeme Möglichkeit, sie alle von einem Ort aus zu deaktivieren.

+3

Alle Ihre Enum-Werte sind auf den gleichen Wert gezwungen, also was erwarten Sie? –

+2

Enumeratoren sind konstante Werte. Sie werden zur Kompilierzeit ausgewertet. –

+0

Bereinigen Sie Ihre 'if's und verwenden Sie einen' Schalter'. Das erste "if" ist zusätzliche Arbeit und bietet einen signifikanten Leistungsgewinn. Ein Schalter kann durch Tabellensuche oder mathematische Funktion ausgewertet werden. –

Antwort

1

Die Werte für 'VAR1..VAR4' werden zur Kompilierzeit definiert, und es ist tatsächlich erlaubt, sie alle auf Null zu setzen, so dass int var=0; var==VAR1; var==VAR2; ... alle zu "wahr" auswerten. Das Problem könnte in Ihrem Code sein, wo Sie haben ; nach jeder if, so dass (sobald Sie Compiler-Fehler aufgrund von else Fehler behoben haben), können Sie alle if-Anweisungen eingeben. Also für den folgenden Code angepasst, keiner der Anrufe ergeben „Enum-Fehler“:

void func(int var){ 
    if(var){ 
     if(var==VAR1){} 
     else if(var==VAR2){} 
     else if(var==VAR3){} 
     else if(var==VAR4){} 
     else {cout << "enum error";} 
    } 
    //doing other things... 
} 

int main() {  
    func(VAR2); 
    func(VAR3); 
    func(VAR4); 
} 

Beachten Sie jedoch, dass Sie in der Regel die enum Typ auch als Argument Typ verwenden würde. Dies würde Sie bei der Kompilierung von mit „undefined ENUM-Werte“ schützen:

void func(var_types var) { ... } 

int main() { 

    func(1); // Compiler error, as `1` is not a valid var_types-member 
} 
0

Alle Ihre ENUM-Einträge werden explizit den Wert 0x0 zugewiesen, so dass sie nicht zu unterscheiden (und alle Null).

Ihre Kommentare zeigen, dass Sie für sie beabsichtigen, unterschiedliche Werte zu haben - und sie würden, wenn man sie nicht explizit Valies zugewiesen haben.

Also, wenn Sie nur die explizite Zuweisung von Werten entfernen, sollten Sie bekommen, was Sie wollen.

Aber was ich wirklich möchte wissen; Was ist das tatsächliche Problem, das Sie hier versuchen zu lösen?

Verwandte Themen