Fehler und Warnungen von C++-Compilern, die durch Clang erweitert wurden
Nach oben zu Durch Clang erweiterte C++-Compiler
Inhaltsverzeichnis
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.