2013-10-06 8 views
8

Ich versuche, etwas c-Code mit g ++ zu kompilieren (ja, absichtlich). Ich erhalte Fehler wie (zum Beispiel):So unterdrücken Sie Warnungen für 'void *' - 'foo *' - Konvertierungen (reduziert von Fehlern durch -fmissive)

error: invalid conversion from 'void*' to 'unsigned char*' [-fpermissive] 

Hinzufügen -fpermissive der Kompilierungsoptionen bekomme ich:

error: invalid conversion from 'void*' to 'unsigned char*' [-Werror=permissive] 

das ein Fehler zu sein scheint, weil -Werror jedoch das Hinzufügen -Wno-error=permissive -Wno-permissive Ergebnisse in:

error: -Werror=permissive: no option -Wpermissive 
error: unrecognized command line option "-Wno-permissive" [-Werror] 

Wie deaktiviere ich Warnungen (globaly) für Konvertierungen von void * zu anderen Zeigertypen?

+4

Sie können den Compiler reparieren oder Sie können Ihren Code reparieren, 1989 war vor langer Zeit. Kommen Sie voran, indem Sie einen expliziten (Cast) in Ihren Code schreiben. –

+2

Durch die Unterdrückung von Fehlern werden die Fehler nicht beseitigt. Es hat keinen Sinn zu sagen, dass Sie C als C++ kompilieren wollen und sich dann beschweren, dass Sie kein gültiges C++ haben. Wenn Sie es als C++ kompilieren wollen, dann konvertieren Sie es in gültiges C++, oder kompilieren Sie es als C. –

+2

(Okay, apparrently stackoverflow reorders tags; entfernt 'C++' für jetzt.) Ich bin * specifisch * interessiert an 'g ++' (nicht irgendeine zufällige C++ - Implementierung), um diese Warnungen zu ignorieren und was das Äquivalent von "-Wno-" für "permissive" ist. –

Antwort

7

Sie können nicht „deaktivieren Warnungen für Konvertierungen von void* zu anderen Zeigertypen“, weil diese nicht eine Warnung - es ist ein Syntaxfehler.

hier Was passiert ist, dass Sie -fpermissive verwenden, die einige Fehler Herabstufungen - einschließlich dieser - auf Warnungen, und deshalb können Sie einige nicht-konformen Code (natürlich viele Arten von Syntaxfehler, wie fehlende Klammern kompilieren , kann nicht zu Warnungen herabgestuft werden, da der Compiler nicht wissen kann, wie man sie repariert, um sie in verständlichen Code umzuwandeln).

Dann verwenden Sie auch -Werror, die alle Warnungen auf Fehler aktualisiert, einschließlich der "Warnungen", dass -fpermissive Ihren Fehler in hat.

-Wno-error-Werror nur zu negieren verwendet wird, das heißt, sie bewirkt, dass -Werror alle Warnungen als Fehler behandeln, außer die mit -Wno-error angegebenen Warnungen, die als Warnungen bleiben. Wie das Flag -W andeutet, arbeiten beide Flags mit Warnungen, so dass sie nichts mit diesem speziellen Problem tun können, denn was Sie hier haben, ist ein Fehler.Es gibt keine "Warnung" für diese Art ungültiger Konvertierung, die Sie mit -Werror aus- und wieder einschalten können, weil es keine echte Warnung ist - es ist ein Fehler, dass -fpermissive lediglich dazu dient, als Warnung behandelt zu werden.

können Sie kompilieren Ihre Nicht-comforming Code, in diesem Fall durch die Verwendung -fpermissive und nicht-Werror verwenden. Dies wird Sie weiterhin warnen, aber wie bei allen Warnungen wird die erfolgreiche Kompilierung nicht verhindert. Wenn Sie absichtlich versuchen, nichtkonformen Code zu kompilieren, ist die Verwendung von -Werror nicht sinnvoll, da Sie wissen, dass Ihr Code Fehler enthält und daher zu Warnungen führt, auch wenn -Werror mit der Aussage "Bitte kompilieren Sie nicht meine nicht konformer Code, obwohl ich dich gerade darum gebeten habe. "

Das weiteste, das Sie gehen können, um g ++ zu bekommen, um Warnungen zu unterdrücken, ist, -fsyntax-only zu verwenden, das nach Syntaxfehlern und sonst nichts überprüfen wird, aber was Sie hier haben, ist ein Syntaxfehler, der Ihnen und dem Besten nicht hilft Sie können dies in eine Warnung von -fpermissive umgewandelt haben.

+1

Um genau zu sein, ist diese Umwandlung semantisch inkorrekt, nicht syntaktisch, wie z.B. fehlende Klammern oder jetzt reservierte Identifikatoren. – user3125367

1

Wie deaktiviere ich Warnungen (global) für Konvertierungen von void * zu anderen Zeigertypen?

Nun, es könnte direkte Interaktion mit Compiler-Code erfordern. Dies ist wahrscheinlich nicht das, was Sie wollen. Sie möchten Ihren Code reparieren. Erstens sind dies keine Warnungen, sondern Fehler. Sie müssen void* umwandeln, da Sie kein void* in etwas umwandeln können, ohne es zuerst zu werfen (es ist in C möglich, das weniger Typ ist, der sicher ist, wie C++ ist).

Zum Beispiel müssten Sie

void* buffer = operator new(100); 
unsigned char* etherhead = static_cast<unsigned char*>(buffer); 
           ^
           cast 

tun Wenn Sie einen dynamisch zugewiesenen Puffer von 100 unsigned char wollen, dann sind Sie besser dran, dies zu tun

unsigned char* p = new unsigned char[100]; 

und die Vermeidung der Besetzung.

void pointers

+3

+1 Es sollte wahrscheinlich bemerkt werden, dass dies passiert, wenn Sie C-Code mit einem C++ - Compiler kompilieren. Im Gegensatz zu dem, was in der Wissenschaft gelehrt wird, ist man * nicht * eine allumfassende Teilmenge der anderen. (und verwende 'static_cast (buffer)', btw.) – WhozCraig

+0

@WhozCraig In der Tat. Ich habe tatsächlich einen Akademiker dazu gebracht, diesen Anspruch nicht nur auf mich zu erheben, sondern ihn auch mit einem völlig falschen, fabrizierten Zitat aus dem C++ - Standard zu untermauern, was natürlich in der Realität genau das Gegenteil sagt. – EJP

+1

Eigentlich, wenn die Quelle C ist, dann würde er eher ein malloc() als irgendein neues haben. Ein weiterer * kleiner * Unterschied zwischen C und C++. –

Verwandte Themen