Was ist der Zweck eines 'if (0) - block-if-else-block?
Meine Frage ist, über die line, die ich erwähnt habe in dem Thema, und ich kann sehen, in vielen Orten innerhalb der Produktion von code.
Der gesamte code sieht wie folgt aus:
if (0) {
//Empty braces
} else if (some_fn_call()) {
//actual code
} else if (some_other_fn_call()) {
//another actual code
...
} else {
//default case
}
Die anderen Zweige sind irrelevant für meine Frage. Ich Frage mich, was die Bedeutung der Umsetzung if (0)
hier ist. Die Klammern sind leer, so dass ich glaube nicht, dass es soll Kommentar einige code-block. Tut es Kraft der compiler, um einige Optimierungs-oder sind Ihre Absichten anders?
Ich habe versucht, die Suche für diesen expliziten Fall hier auf SO und auf im internet, aber ohne Erfolg. Es sind ähnliche Fragen, die über JavaScript, aber nicht in C. Es ist eine andere Frage, Was passiert, wenn eine null zugeordnet ist, in einem `if` - Bedingung?, aber es wird erörtert, null Zuordnung zu einer variable, nicht die 'if (0)' Nutzung selbst.
- Kommentare sind nicht für längeren Gespräch; das Gespräch wurde verschoben zum chat.
- Diese Aussage scheint irrelevant. Generieren von Assembler-code mit und ohne Anweisung und du wirst sehen, was Los ist unter der Haube.
- Es ist möglich dies ist eine automatisch generierte code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Manchmal benutze ich diese für Symmetrie, so kann ich verschieben Sie die anderen
else if{
frei, um mit meiner Lektorin, ohne den Sinn der erstenif
.Semantisch die
Teil nicht alles tun, und Sie können darauf zählen, Optimierer, um es zu löschen.
if else
dann, wenn(0) mag Sinn machen, aber fürif, else if
ich nicht den Grund sehen.else if
Bedingungen, sagen wir größer als 10,if else
Präfix, um alle signifikanten Pfade code Zeilen, die die Bedingungen oben schön und macht das Scannen einfacher. (Das ist subjektiv, aber, und würde hängt viel von dem, was wirklich im inneren der Bedingungen und code-Blöcke.)if (0) {..}
führt jede parsability/Lesbarkeit problem. Es sollte klar sein, wer weiß etwas von C. Das ist nicht ein Problem. Das problem ist der follow-up-Frage nach dem Lesen: "Was zum Teufel ist es denn dann?" Es sei denn, es ist für die Fehlersuche/vorübergehende Zwecke (D. H., die Absicht, zu "aktivieren", dassif
block später), würde ich befürworten, entfernen zusammen. Im Grunde ist das "Lesen" dieser code würde wahrscheinlich dazu führen, dass eine unnötige "pause" für den Leser, für keinen guten Grund. Und das ist ein guter genug Grund, um es zu entfernen.if( 0 )
können helfen "ästhetisch" wenn dieelse if
Einträge sind alle einzelnen Leitungen... z.B. eine Folge vonelse if( conditonA() ) actionA() ;
...else if( conditonE() ) actionE() ;
Linien (mit oder ohne Klammern, wie Sie sehen, passen).where 1 = 1
und dannand statement
auf anderen Linien.if
zuelse
keine? (Wie wählen Sie ausif
zuelse
und verschieben Sie es auf, bevor ein andererif
oder nach einer anderenelse
). Etwas mehr Aufwand als die Bewegung von ganzen Zeilen zu einem Zeitpunkt, aber es ist nur noch ein single-copy-and-paste oder drag.if (0) {}
oder keineif (0){}
, es ist keine große Sache und eigentlich egal. Auf die Lösung Aktueller Probleme :). (Menschen auf jeden Fall zu lieben scheinen bikeshedding 🙂 )else if
um den editor ohne Sorge", denn die Bedingungen dürfen sich nicht gegenseitig ausschließen, in diesem Fall um zählt. Persönlich würde ich nurif
, und führen Sie Anfang zurück, extrahieren Sie die Logik-Kette, um eine separate Funktion, wenn nötig.if(cond)
in einem kaskadiertenif(cond1){code1} else if(cond2){ code2 } ... else{codeElse }
es löscht automatisch dieif(cond1){code1}
und wandeltelse if(cond2){
inif(cond2){
? Wenn ja, welcher editor? // Tatsächlich, ich nehme an, ich bin schon mit solch einen editor, in eine der EMACS-zahlreiche Modi. Aber ich gestehe zu, wieder zurück zu fallen, um text zu Bearbeiten, einfach nur löschen der Zeilen, eine Menge.if
vorelse
und drücken Sie löschenDies kann nützlich sein, wenn es
#if
Aussagen, alaetc.
In diesem Fall (und alle), können die tests
#if
'ed out, und der code ordnungsgemäß kompiliert. Fast alle Compiler entfernt dieif (0) {}
Teil.Eine einfache autogenerator könnte code generieren, wie es ist etwas einfacher zu Programmieren ist es nicht zu betrachten, die zuerst aktiviert block getrennt.
if
/else if
Kette nicht so viel wie ein Entscheidungsbaum, sondern eher als ein "handeln auf erste passende Bedingung" konstruieren, wo der Zustand, der geschieht, haben die höchste Priorität ist nicht besonders "Spezial". Während ich hatte nicht gesehenif(0)
verwendet, als eine Möglichkeit, alle real-Filialen zu haben konsistente syntax, wie ich die einheitliche syntax erleichtert.else if
Linie in zwei und legen Sie die Präprozessor-guard dazwischen.if (0)
Zweig und zu formatieren, den rest, so dasselse
ist auf seine eigene Linie, umgeben von einer Wache entlang der Linien von#if TEST1_ENABLED && TEST2_ENABLED
.#if (TEST1_ENABLED || TEST2_ENABLED || TEST3_ENABLED) && TEST4_ENABLED
?if
Wache an der Spitze.Habe ich gesehen, dass ein ähnliches Muster in den generierten code. Zum Beispiel in SQL, ich habe gesehen, Bibliotheken emittieren die folgenden
where
- Klausel.Diese vermutlich macht es einfacher, fügen Sie einfach auf andere Kriterien, da alle weiteren Kriterien vorangestellt werden kann mit
and
statt eine zusätzliche überprüfung, um zu sehen, ob es die erste Kriterien, oder nicht.1=1
ist auch "nützlich", da können Sie immer fügen Sie diewhere
vor, bedingungslos. Sonst müsste man überprüfen, ob es leer ist, und wenn dem so vermeiden Sie die Erzeugung derwhere
- Klausel.1=1
von derWHERE
, so dass es nicht einen Einfluss auf die Leistung.Wie geschrieben, die
if (0) {}
Klausel kompiliert aus nichts.Ich vermute, dass die Funktion der Klausel an der Spitze dieser Leiter ist eine einfache Ort, um vorübergehend deaktivieren Sie alle anderen Funktionen auf einmal (für debugging oder Vergleichszwecke) durch ändern der
0
zu einem1
odertrue
.Es ist code rot.
Irgendwann, dass "wenn" haben Sie etwas nützliches, änderte sich die situation, vielleicht die variable, die ausgewertet wird, wurde entfernt.
Die person, die Festsetzung/änderung des Systems hat so wenig wie möglich zu beeinflussen die Logik des Systems so dass er nur sicher gestellt, würde der code neu kompilieren. So lässt er eine "if(0)" denn das ist schnell und einfach, und er ist nicht völlig sicher, was er tun will. Er bekommt das system funktioniert, und er nicht zurück gehen, um es zu beheben vollkommen.
Dann der nächste Entwickler kommt und denkt, dass wurde absichtlich getan und nur Kommentare hin, dass ein Teil des Codes (da es nicht bewertet wird, sowieso), dann das nächste mal der code berührten die Kommentare werden entfernt.
Einer Möglichkeit noch nicht erwähnt: die
if (0) {
Zeile könnte auch die Bereitstellung einer bequemen Lage für einen Haltepunkt.Debugging ist oft auf die nicht-optimierten code, so das immer-falsch-test wird anwesend sein und können Haltepunkt festgelegt sind. Wenn kompiliert, die für die Produktion, die Linie der code optimiert werden, aus. Das scheinbar nutzlose Zeile gibt an Funktionalität für Entwicklung und testing-builds, ohne Auswirkungen auf die release-builds.
Gibt es andere gute Vorschläge vor; es ist der einzige Weg, wirklich zu wissen, was der Zweck ist, ist auf die Spur des Autors und Fragen. Ihre source-code-control-system könnte helfen. (Schauen Sie für
blame
-Funktionalität Typ.)Ich bin nicht sicher, ob alle Optimierungen, aber meine zwei Cent:
Dies geschah, weil einige code-änderungen, wo eine primäre Bedingung entfernt wurde, (der Aufruf der Funktion in der anfänglichen
if
block, sagen wir mal), aber die Entwickler/maintainerif-else
blockso entfernen, sondern die damit verbundenen
if
block, änderte Sie einfach die Bedingung zuif(0)
und zog Sie auf.if(0)
verringern, branch-coverage zu?Ich gesehen habe, nicht erreichbaren code-Blöcke in pre-erweitert-JavaScript generiert wurden, mit Hilfe einer Template-Sprache.
Beispielsweise der code, den Sie Lesen konnte, wurden eingefügt, die von einem server vorab ausgewertet die erste Bedingung, die zu dieser Zeit stützte sich auf eine variable, die nur auf der server-Seite.
einmal die pre-compiled hences :
hoffe, dies hilft, Sie relativieren die potentielle low-Tastatur-Aktivität der pro-recycling-Programmierer-ära, für die ich manifestieren Begeisterung !
Diesem Konstrukt kann auch verwendet werden, in C zu implementieren der generischen Programmierung mit Typ-Sicherheit, die sich auf die Tatsache, dass die unreachable code noch aktiviert, indem der compiler:
Ich finde es einfach nur schlechter code. Schreiben Sie ein kurzes Beispiel in der Compiler-Explorer, sehen wir, dass in beiden gcc und clang wird kein code generiert für die
if (0)
block, auch mit Optimierungen komplett gesperrt:https://godbolt.org/z/PETIks
Spielen, um mit dem entfernen der
if (0)
bewirkt, dass keine änderungen am generierten code, so schließe ich, dass dies nicht eine Optimierung.Es ist möglich, dass es verwendet werden, um etwas in der top -
if
block wurde später entfernt. Kurz gesagt, es sieht aus wie es zu entfernen bewirkt, dass der exakt gleiche code generiert werden, so fühlen sich frei, das zu tun.Als es ist gesagt worden, der null ist, evaluiert zu false, und die Branche wird wahrscheinlich optimiert durch den compiler.
Hab ich auch gesehen vorher im code, wo eine neue Funktion wurde Hinzugefügt und ein kill-switch benötigt wurde (wenn etwas schief geht mit dem feature können Sie einfach schalten Sie es aus), und einige Zeit später, wenn der kill-Schalter entfernt wurde, der Programmierer hat nicht auch entfernen Sie den Zweig, z.B.
wurde
Hilft es, die debug-diesen block nur setzen, wenn block 1. Diese deaktivieren Sie alle if -, else-block-Funktionalität. Und wir können auch erweitern Sie die if-else-block.
@PSkocik s Antwort ist gut, aber ich hinzufügen meine zwei Cent. Nicht sicher, ob ich sollte dieses tun als einen Kommentar, oder eine Antwort; die Wahl der letzteren, denn IMHO lohnt sich anderen zu sehen, während die Kommentare sind Häufig unsichtbar.
Nicht nur, dass ich ab und zu benutzen
Aber ich gelegentlich auch tun
oder
für komplizierte Bedingungen. Für die gleichen Gründe - einfacher zu Bearbeiten, #ifdef, etc..
Für diese Angelegenheit, in Perl werde ich tun
Vergleiche ich die
if(0)
code lispwelche, Sie Ahnen es, ich kann Spiegelstrich wie
Habe ich manchmal versucht mir vorzustellen, was eine mehr menschenlesbare syntax dafür Aussehen könnte.
Vielleicht
inspiriert von Dikstra s [https://en.wikipedia.org/wiki/Guarded_Command_Language#Selection:_if%5D%5BBewacht Command Language].
Aber diese syntax bedeutet, dass die Bedingungen ausgewertet werden parallel, in der Erwägung, dass
if...else-if
impliziert sequentielle und priorisiert, die die Auswertung von Bedingungen.Ich begann, das zu tun diese Art der Sache, wenn das schreiben von Programmen generiert, dass andere Programme, wo es besonders bequem.
Während wir an es, beim schreiben von RTL mit Intel alt iHDL, ich habe codierten Sachen wie
wo die
FORC..DOC..ENDC
ist ein makro-Präprozessor-loop-Konstrukt, das erweitert, umDiese war die einzige Zuweisung, die nicht zwingend notwendig, den code, sodass die Einstellung ein state-variable war nicht erlaubt, wenn Sie benötigt werden, Dinge zu tun, wie find first set bit.
Kommen zu denken, dies war der erste Ort, stieß ich auf solche Konstrukte.
BTW, die Einwände, die einige hatten sich um den if - (0) Stil -, dass die sonst-wenn-Bedingungen werden sequentiell abhängig und können nicht beliebig neu angeordnet werden - gelten nicht für die und-UND ODER-und XOR-Logik in der RTL - aber tun gelten für short-circuit && und ||.
Habe ich gesehen das ein paar mal, ich denke der wahrscheinlichste Grund ist, es war die Bewertung etwas in einer älteren/anderen version/branch-code, oder möglicherweise für das Debuggen und ändern, um
if(0)
ist etwas faul entfernen, was auch immer dort war.