Announcement

Collapse
No announcement yet.

keine Warnung bei unbenutzter Variable

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • keine Warnung bei unbenutzter Variable

    Hallo,

    ich bekomme von meinem Compiler (mingw) bei nicht benutzten internen Variablen eine Warnung.
    Das macht er aber nicht bei std::string.

    Bug oder Feature ?



    Grüße aus Edemissen Mirko

  • #2
    Das macht er aber nicht bei std::string. -> Warum auch, es ist ja keine Variable
    Christian

    Comment


    • #3
      man benutzt std::string doch aber wie eine Variable.

      Mirko

      Comment


      • #4
        Sicher, aber so wie du das hingeschrieben hast ist da keine Variable. Hast du damit eine gloable Variable angelegt? Vielleicht kann dein Compiler auch nur native Typen prüfen und Klassen eben nicht
        Christian

        Comment


        • #5
          Beispiel in einer Funktion

          double a;
          std::string b;
          ....

          bei a wird gewarnt das es nicht benutzt wird.
          bei b eben nicht.

          das stört mich, da ich gerne vom compiler gewarnt werden möchte, wenn da was unbenutztes rumfliegt.
          Oder kann das kein c++ compiler ??

          Mirko

          Comment


          • #6
            Vielleicht macht er es bei Klassen nicht
            Christian

            Comment


            • #7
              Also nochmal ausführlicher (um Christians Antwort deutlicher darzustellen):

              double ist ein Intergraler Typ, d.h. der Compiler reserviert dafür Speicher auf dem Stack lässt ihn aber ansonsten in Ruhe. Was vorher drin stand bleibt drin. Der Typ selber hat keine Möglichkeit eine Initialisierung durchzuführen, der Speicher kann aber auch nur dazu genutzt werden, daraus zu lesen oder hinein zu schreiben. Wenn eine solche Variable deklariert wird, aber nirgends genutzt wird, ist dies meist ein Programmierfehler: entweder wurde die Variable mal angedacht, dann aber doch nicht genutzt, oder (viel schlimmer) die Variable gehört zum Konzept, dort wo aber auf diese Variable zugegrifen wird, wird aufgrund eines Fehlers in eine andere Variable geschrieben oder von ihr gelesen. Dies kann der Compiler feststellen, gibt es aber bei den meisten "nur" als Warning aus, es sei denn man konfiguriert es als Fehler.

              Anders ist es bei string, dies ist eine Klasse, zwar eine Klasse aus einer besonderen Bibliothek, aber dennoch eine Klasse. Eine Klasse kann einen Basiskonstruktor (ohne Argumente) haben, der nicht nur die in der Variablen des Klassentyps gehaltenen Datenstrukturen initialisiert, sondern auch anderweitig das System beeinflusst, ohne dass mit der Variablen selbst jemals wieder etwas angefangen wird. Stell Dir z.B. eine Klasse vor, die im Konstruktor Verbindung zu einem Peripheriegerät aufnimmt und dies initialisiert, und im Destruktor das Gerät wieder auf Standby schaltet. Hier wird ein einziges Mal in der main-Funktion der Anwendung ein Objekt dieser Klasse erstellt, und danach mit dem Objekt nie wieder was getan bei Programmende wird der Destruktor der Klasse aufgerufen und räumt auf.

              Wie soll ein Compiler feststellen
              a) ob im Konstruktor der Klasse irgendetwas sinnvolles geschieht,
              b) ob die Klasse eine explizite Initialisierung benötigt, zumal eine Intialisierung durch Zuweisung manchmal gar nicht möglich ist,
              c) ob die volle Funktionalität eines solchen Objektes schon in Konstruktor und Destruktor ausgeschöpft ist,
              ohne die Implementierung der Klasse an Regeln zu binden, die dann wieder an den jeweiligen Compiler gebunden sind, und keywords enthalten können, die von anderen Compilern nicht verstanden werden?

              Es ist einem Compiler also gar nicht möglich, die von Dir gewünschte Überprüfung durchzuführen, ohne Gefahr zu laufen, dass Kriterien nach denen er prüft zu falschen Alarmen führt. Zumindest kann ich mir keinen Compiler vorstellen, der so etwas für Klassen überprüfen kann.

              Gruß
              Martin
              Zuletzt editiert von M.Dietz; 08.08.2012, 15:20.

              Comment

              Working...
              X