Das unterdrücken von Warnungen für 'void*' to 'foo*' - Konvertierungen (reduziert von Fehlern durch -fpermissive)
Ich versuche zu kompilieren von c-code mit g++ (ja, absichtlich). Ich bin immer Fehler wie (zum Beispiel):
error: invalid conversion from 'void*' to 'unsigned char*' [-fpermissive]
hinzufügen -fpermissive
der Zusammenstellung Optionen bekommt von mir:
error: invalid conversion from 'void*' to 'unsigned char*' [-Werror=permissive]
das scheint zu sein, ein Fehler, da der -Werror
jedoch hinzufügen -Wno-error=permissive -Wno-permissive
Ergebnisse in:
error: -Werror=permissive: no option -Wpermissive
error: unrecognized command line option "-Wno-permissive" [-Werror]
Wie kann ich deaktivieren, Warnungen (globaly) für Konvertierungen von void* in andere Zeigertypen?
- Sie können es beheben, compiler, oder Sie können fixieren Sie Ihre code ein, 1989 war vor langer Zeit. Erhalten Sie vor, indem Sie einen explizit (cast) in Ihrem code.
- Unterdrückung Fehler nicht machen die Fehler Weg. Es gibt keinen Sinn, zu sagen, die Sie kompilieren wollen C als C++ und dann beschweren, dass Sie keinen gültigen C++. Wenn Sie möchten, um es zu kompilieren als C++, dann wandeln Sie es um gültigen C++, oder kompilieren Sie es als C.
- (Okay, apparrently stackoverflow verschiebt tags; entfernt
c++
für jetzt.) Ich interessiere mich speziell im erzähleng++
(nicht in jeder x-beliebigen c++ - Implementierung), ignorieren diese Warnungen und an das, was die Entsprechung der-Wno-<warning>
ist fürpermissive
. - Ich bin nicht sicher, dass Sie verstehen, was diese flags tun.
-fpermissive
Herabstufungen einige Fehler in Warnungen, und-Werror
aktualisiert alle Warnungen für Fehler.-Wno-error
bewirkt, dass eine Warnung angegeben, die-Werror
hat aktualisiert, um einen Fehler herabgestuft werden wieder zu einer Verwarnung.-Wno-error
wird nicht für Sie arbeiten hier, weil Sie einen Fehler, um mit zu beginnen, nicht eine Warnung, die aktualisiert wurde zu einem. Wenn Sie wirklich darauf bestehen, dies zu tun, dann verwenden Sie einfach-fpermissive
und verwenden Sie nicht-Werror
an alle, da es ist verrückt, sich für die letztere, wenn Sie bewusst versuchen, zu kompilieren non-konformen code. - tatsächlich, ich verstehe, was diese flags tun. Wenn Sie verstehen, wie Sie tun, und wissen, dass (zum Beispiel) {können Sie nicht ignorieren
permissive
weil es nicht behandelt, die von der normalen[-Werror=]
Mechanismen}, könnte Sie veröffentlichen die Erklärung, die als Antwort so kann ich es akzeptieren? Ein "Nein, das ist nicht möglich, weil diese" Antwort, während die dissapointing, wäre eigentlich eine Antwort, im Gegensatz zu einem "Nein, das ist nicht, was Sie wollen, obwohl Sie versucht, deutlich zu machen, dass das ist genau das, was Sie wollen' nicht-Antwort. - Ich fügte hinzu, eine Antwort für Sie.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann man nicht "deaktivieren der Warnungen für Konvertierungen von
void*
zu anderen Zeigertypen", denn dies ist nicht eine Warnung - es ist ein syntax Fehler.Was hier passiert ist, dass Sie mit
-fpermissive
die Herabstufungen einiger Fehler, einschließlich dieser Warnhinweise, und daher ermöglicht die Zusammenstellung einige non-conforming code (offensichtlich viele Arten von syntax-Fehler, wie fehlende Klammern, kann nicht heruntergestuft werden, um Warnungen, da der compiler kann nicht wissen, wie Sie zu beheben, um Sie in verständlichen code).Dann kommen Sie auch mit
-Werror
welche upgrades Sie alle Warnhinweise, die auf Fehler, einschließlich der "Warnungen", die-fpermissive
hat sich Ihre Fehler in.-Wno-error
wird nur verwendet, um Sie zu negieren-Werror
, d.h. es bewirkt, dass-Werror
zu behandeln, alle Warnungen als Fehler außer die Warnungen angegeben mit-Wno-error
ist, bleiben die als Warnungen. Als die-W
Flagge schlägt vor, diese beiden flags arbeiten mit Warnungen, so dass Sie nicht alles tun, mit diesem bestimmten Problem, da das, was Sie hier haben, ist eine Fehler. Es gibt keine "Warnung" für diese Art von ungültige Konvertierung, Sie können abschalten und auf mit-Werror
denn es ist nicht eine echte Warnung - es ist ein Fehler, dass-fpermissive
ist lediglich verursacht, so behandelt werden, als eine Warnung.Können Sie kompilieren Ihre nicht-comforming-code, in diesem Fall durch die Verwendung
-fpermissive
und nicht Verwendung-Werror
. Dies wird immer noch geben Ihnen eine Warnung, aber wie alle Warnungen, es wird nicht verhindern, dass erfolgreiche Kompilierung. Wenn Sie bewusst versuchen, zu kompilieren nicht-standardkonformes, dann mit-Werror
macht keinen Sinn, denn du weißt, dein code enthält Fehler und wird deshalb zu Warnungen, selbst mit-fpermissive
, so die Angabe-Werror
ist das gleiche wie zu sagen "bitte nicht kompilieren meine nicht-standardkonformes, obwohl ich nur fragte Sie."Den am weitesten können Sie gehen, um g++ zum unterdrücken von Warnungen ist die Verwendung
-fsyntax-only
eine Prüfung auf syntax-Fehler und sonst nichts, aber da das, was Sie hier haben, ist ein syntax-Fehler, dass wird Ihnen nicht helfen, und das beste, was Sie tun können, ist, dass sich in einer Abmahnung-fpermissive
.Gut es erfordert möglicherweise direkte Interaktion mit compiler den code. Dies ist wahrscheinlich nicht das, was Sie wollen. Sie wollen fix in Ihren code ein. Erstens, das sind keine Warnungen, sondern Fehler. Sie müssen gegossen
void*
wie Sie können nicht konvertieren einevoid*
nichts ohne casting es zuerst (es ist möglich, in C aber die ist weniger Typ sicher wie C++ ist).Beispielsweise Sie tun müssen, würde
Wenn Sie möchten, einen dynamisch zugewiesenen Puffer von 100
unsigned char
dann sind Sie besser dran, dies zu tunund die Vermeidung der Stimmen.
void-Zeiger
static_cast<unsigned char*>(buffer)
, btw.)