So lösen Sie das Problem verschachtelter Kommentare


23

Es erscheint nicht nur in einer Sprache, dass Kommentare nicht verschachtelt werden können. Haben Sie eine gute Lösung für dieses Problem? Eine Problemumgehung in C / C ++ und Java besteht darin, nur den einzeiligen Kommentar zu verwenden. In diesem Fall ist es jedoch unmöglich, einen größeren Block auszukommentieren. Ich stehe vor so etwas:

</li><!--
                <li><!-- Save -->

Also muss ich die Kommentare manuell durchgehen und bearbeiten. Können Sie uns in vielen Sprachen raten, wie wir damit umgehen sollen? Ich bin mir nicht sicher, aber vielleicht hat Python eine Lösung dafür ''', wie man einen #Kommentar in Python einfügen kann. `


4
Ich denke nur Redakteure können dir da weiterhelfen. IDLE blockiert jedoch Kommentare zu Python IIRC für Sie.
Erik Reppen

7
Python hat keine Blockkommentare . Das '''und """sind Zeichenkettenliterale . Es kommt vor, dass der Interpreter sie während der Kompilierung (zum Bytecode) auswertet und die String-Literale als No-Ops erkennt (daher verlangsamen sie nicht die Bytecode-Ausführung / Ladezeit). Dokumentzeichenfolgen, dh Zeichenfolgenliterale direkt nach einem, defaber vor dem Textkörper, werden nicht entfernt, da der Interpreter davon ausgeht, dass sie die Dokumentation für die Funktion bereitstellen.
Bakuriu

7
Wenn Sie in C / C ++ große Abschnitte entfernen möchten, verwenden Sie #if 0<code> #endif. Das ist also kein wirkliches Problem. Das Verwenden von Kommentaren zu diesem Zweck ist das falsche Tool.
Martin York

1
Ich bin vor langer Zeit dazu übergegangen, nur Zeilenkommentare zu verwenden (solange ich nicht gezwungen bin, z. B. Javadoc). Natürlich benötigen Sie Editorunterstützung (oder zumindest Spaltenmodus).
Ziggystar

Antworten:


46

Die beste Lösung ist natürlich, Ihre Kommentare einfach nicht zu verschachteln. Verschachtelte Kommentare sind normalerweise ein Zeichen dafür, dass Sie falsche Kommentare verwenden. Das gebräuchlichste Beispiel ist auskommentierter Code, der selbst Kommentare enthält, und die Korrektur besteht darin, den Code zu entfernen, anstatt ihn auszukommentieren.

Das heißt, viele Programmiersprachen haben mehr als eine Art von Kommentarsyntax, und Sie können diese Tatsache verwenden, um mindestens eine Ebene tief zu verschachteln. Zum Beispiel in Java:

/* This is commented out!
Foo.bar.baz();
// And now for something completely different...
Quux.runWith(theMoney);
*/

Außerdem ist in vielen Sprachen mindestens ein Kommentartyp verschachtelbar. In C-ähnlichen Sprachen werden Zeilenkommentare in Zeilenkommentaren ignoriert:

// some_commented_out(code);
// // This is a comment inside the comment!
// // Still inside the nested comment.
// some_more_code_in(outer_comment);

Die meisten IDEs unterstützen das Kommentieren ganzer Codeblöcke mit Zeilenkommentaren in einer Aktion und behandeln diese Art von Kommentarstil korrekt. Das gleiche Beispiel in Python:

# some_commented_out(code)
# # This is a comment inside the comment!
# # Still inside the nested comment.
# some_more_code_in(outer_comment)

Häufig enthalten Codierungsstandards für ein bestimmtes Projekt Regeln darüber, welcher Kommentarstil wann verwendet werden soll. Eine übliche Konvention ist die Verwendung von Blockkommentaren ( /* */) für die Dokumentation von Methoden und Klassen sowie von Inline-Kommentaren ( //) für Anmerkungen in Methodenkörpern und dergleichen, z.

/**
 * Helper class to store Foo objects inside a bar.
 */
public class Foobar {
    /**
     * Stores a Foo in this Foobar's bar, unless the bar already contains
     * an equivalent Foo.
     * Returns the number of Foos added (always 0 or 1).
     */
    public int storeFoo(Foo foo) {
        // Don't add a foo we already have!
        if (this.bar.contains(foo)) {
            return 0;
        }
        // OK, we don't have this foo yet, so we'll add it.
        this.bar.append(foo);
        return 1;
    }
}

Bei einem solchen Stil ist es unwahrscheinlich, dass Sie jemals /* */Kommentare verschachteln müssen (wenn Sie ganze Methoden oder Klassen vorübergehend deaktivieren müssen, funktioniert das Umbenennen genauso gut, wenn nicht sogar besser). und //Kommentare zu tun Nest, zumindest mit einer wenig Hilfe von Ihrem IDE.

Zum Deaktivieren von Code stehen Ihnen in vielen Programmiersprachen weitere Optionen zur Verfügung. In C können Sie beispielsweise den Präprozessor nutzen:

this_is(activated);
#if 0
this_is(!activated);
/* Comments inside this block don't really nest, they are simply removed
   along with the rest of the block! */
#endif

In dynamischen Sprachen können Sie ifstattdessen häufig nur reguläre Anweisungen verwenden:

<?php

if (0) {
   // This should never run... 
   some_stuff_that_should_never_run();
}

Im Gegensatz zum CPP-Beispiel erfordert diese Strategie jedoch, dass die Quelldatei als Ganzes syntaktisch gültig ist, sodass sie bei weitem nicht so flexibel ist.

Und schließlich gibt es zumindest einige Sprachen, die verschachtelte Kommentare zulassen. Bei Interesse hat Wikipedia eine schöne Vergleichstabelle .


2
erlaubt eine SQL-Variante verschachtelte Kommentare?
Xavier Combelle

3
+1 für// And now for something completely different...
Vorac

1
@Vorac: froh, dass dir die Referenz gefällt: D
tdammers

18

C und C ++ haben geschachtelte Blockkommentare:

#if 0
#endif

Viele Hervorhebungs-Editoren verstehen dies als Kommentar, und viele andere werden ihn zumindest als jeden anderen bedingt deaktivierten Code hervorheben.

In vielen anderen Sprachen müssen Sie sich auf die Unterstützung des Editors verlassen. Für Sprachen, die nur zeilenbasierte Kommentare enthalten (Perl, Python, Ruby, Shell ...), ist es ziemlich einfach, das Kommentarzeichen allen Zeilen in einem Bereich voran zu stellen, daher können die meisten Editoren dies tun. Sie können immer noch feststellen, was Kommentare waren, bevor Sie den gesamten Block auskommentieren, da das Kommentarzeichen verdoppelt ist - hier ist es einfach von Vorteil, dies zu tun.

XML und SGML sind wahrscheinlich die größten Probleme. Die Kommentardefinition ist einfach dumm. Die Kommentare wären trivial zu verschachteln gewesen, aber sie tun es nicht nur nicht, es ist völlig verboten, --Insider-Kommentare zu hinterlassen. Leider weiß ich nicht, welche Editoren das Auskommentieren in SGML / XML gut unterstützen.


2
Ich hätte nie gedacht, diese Präprozessor-Direktiven als tatsächliche Kommentare zu verwenden. Interessant, auch für C #, aber in diesem Fall müsste man so etwas tun, #if _was auch gut funktioniert und in meinem VS mit Re # ausgegraut wird. Schöner Tipp!
Grimasse der Verzweiflung

2

Eine Möglichkeit, dieses Problem zu lösen, ist die Verwendung der serverseitigen Vorlagenverarbeitungssprache, um Blockkommentare für verschachtelte Codekommentarelemente zu erstellen. Dadurch bleibt der Inhalt im Wesentlichen intakt, es wird jedoch verhindert, dass er an den Client-Browser gesendet wird.

Das hilft nicht viel, wenn es sich bei der Datei um reine Inhalte handelt, für die keine andere serverseitige Verarbeitung erforderlich ist. Fragen Sie in diesem Fall und im allgemeineren Fall von verschachtelten Kommentaren, warum Sie das tun möchten. In den meisten Fällen stellt man möglicherweise fest, dass der beste Weg, damit umzugehen, darin besteht, nicht mit allem umzugehen. Mit anderen Worten, wenn Sie einen Abschnitt entfernen möchten, müssen Sie ihn entfernen und die Versionskontrolle die Unterschiede berücksichtigen lassen, falls dieser Abschnitt als Artefakt jemals wiederbelebt werden muss.


0

Im HTML / XML-Fall können Sie eine nicht vorhandene Verarbeitungsanweisung verwenden: siehe meine Antwort auf SO

<?ignore
  <band height="20">
    <staticText>
      <reportElement x="180" y="0" width="200" height="20"/>
      <text><![CDATA[Hello World!]]></text>
    </staticText>
  </band>
?>
</detail>

0

Swift unterstützt verschachtelte Kommentare, sodass "es nicht nur in einer Sprache vorkommt, dass Kommentare nicht verschachtelt werden können", keine echte Aussage mehr ist. Wenn Sie mit dem Mangel an Unterstützung für verschachtelte Kommentare in Ihrer Programmiersprache unzufrieden sind, würde ich empfehlen, Swift auszuprobieren.

/* This is the start of the first multiline comment.
 /* This is the second, nested multiline comment. */
 This is the end of the first multiline comment. */

Swift Programming Language: Die Grundlagen


0

Die Programmiersprache D enthält geschachtelte Kommentare:

/+ This is a nested comment 
  /+ This is part of that a comment +/
  /* So is this */
+/
/+ /* This is another nested comment */ +/
/* /* This is not a nested comment */

Mit anderen Worten, /+und +/Kommentare nisten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.