Fehler und Warnungen von C++-Compilern, die durch Clang erweitert wurden

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Durch Clang erweiterte C++-Compiler


Steuern von Warnmeldungen

Die Option Alle Warnungen aktivieren (in Projekt > Optionen > C++-Compiler > Warnungen) ruft den Compiler mit der Option -Weverything auf, die eine Untermenge von -Wall (für alle "leicht zu vermeidenden" Konstruktionen) ist.

Warnungen können einzeln aktiviert oder unterdrückt werden. Dazu ist der Name der Warnung erforderlich. Übergeben Sie zum Anzeigen dieser Namen -fdiagnostics-show-option an den Compiler. Dadurch kann eine Warnung wie die folgende:

File1.cpp:32:11: warning: unused variable 'foo'

in diese geändert werden:

File1.cpp:32:11: warning: unused variable 'foo' [-Wunused-variable]

Sie können dann -Wunused-variable verwenden, um nur diese Warnung und keine anderen zu aktivieren. Ersetzen Sie zum Deaktivieren dieser Warnung das führende -W durch -Wno-, und verwenden Sie diese Option zusammen mit einer Option zum Aktivieren der gewünschten Warnungsebene. Zum Beispiel: -Wall -Wno-unused-variable aktiviert alle leicht zu vermeidenden Warnungen außer der für nicht verwendete Variablen.

Häufige Fehler beim Portieren aus BCC32

Für aus BCC32 portierten Code können folgende Fehler auftreten (in alphabetischer Reihenfolge, Platzhalter wie "x" werden ignoriert).

"x" verweist auf keinen Wert (in template)

Typnamen, die vom template-Parameter abhängen, muss preceded by typename. Ohne dieses Schlüsselwort wird beispielsweise in:

template <class T>
 void doSomething() {
   T::member *var;
}

ein als Zeigerdeklaration gedachtes * als Multiplikation interpretiert; und wenn die gemeinte Variable sich bereits im Gültigkeitsbereich befindet, tritt ein Fehler bezüglich des Versuchs der Multiplikation eines Typnamens ("Member" in diesem Beispiel), der kein Wert ist, auf.

"template" fehlt vor abhängigem Typnamen "x"

Typnamen, die vom template-Parameter abhängen, muss preceded by typename. Ohne dieses Schlüsselwort könnten einige Grenzfälle andere Fehler erzeugen, aber im Allgemeinen ist der Fehler und die Lösung klar.

Durch Einfügung entstand "x", ein ungültiges Token für die Vorverarbeitung

Durch das Einfügen von Token mit dem Präprozessoroperator ## muss ein einzelnes gültiges Token gebildet werden. In vielen Fällen ist der Operator nicht in erster Linie erforderlich, daher kann das Problem durch einfaches Entfernen des Operators behoben werden.

Public Symbol "x" ist in Modul A und B definiert

Zum Beispiel:

[ilink64 Error] Error: Public symbol 'triplet::sum' defined in both module C:\USERS\WIN764\NODES.O and C:\USERS\WIN764\UNIT1.O

Statische Daten-Member müssen in einem Header deklariert und dürfen nur einmal in einer Quelldatei (nicht im Header) definiert werden.

ILINK64 ist hier dokumentiert: ILINK64.EXE: Der inkrementelle 64-Bit-Linker

Verwendung vom nicht deklariertem Bezeichner "x" (in template)

Aufgrund der zweiphasigen Namenssuche in Templates werden in Basisklassen vorhandene Bezeichner nur aufgelöst, wenn sie mit this-> qualifiziert sind.

Auch Typnamen, die vom template-Parameter abhängen, muss typename vorangestellt werden. Ohne dieses Schlüsselwort wird beispielsweise in:

template <class T>
 void doSomething() {
   T::member *var;
}

ein als Zeigerdeklaration gedachtes * als Multiplikation interpretiert; und wenn die gemeinte Variable sich nicht bereits im Gültigkeitsbereich befindet, tritt ein Fehler bezüglich des Versuchs der Multiplikation eines template-Wertes mit dem nicht deklarierten Bezeichner ("var" in diesem Beispiel) auf.

Häufige Warnungen beim Portieren aus BCC32

Für aus BCC32 portierten Code können folgende Warnungen auftreten (in alphabetischer Reihenfolge), die unterdrückt werden können.

Konvertierung aus String-Literal in "char *" ist veraltet

-Wdeprecated-writable-strings

Sie sollten einem literalen C-String keinen reinen char-Zeiger zuweisen. Legen Sie den Zeiger als const fest (und ziehen Sie eventuell die Verwendung von std::string in Betracht).

Implizite Konvertierung ändert Vorzeichenmöglichkeit (signedness)

-Wsign-conversion

BCC32 ignoriert Zuweisungen von "signed" zu "unsigned". Durch Clang erweiterte C++-Compiler geben bei diesen Zuweisungen eine Warnung oder eine Fehlermeldung aus.

Siehe auch