Frage

Ich habe ein Projekt, wo ich gerade entdeckt habe, dass Warnung C4244 (möglicher Datenverlust) unterdrückt wird. Ich vermute stark, dass einige miese MS-Header diese Warnung unterdrückt und verlassen es für alle Übersetzungseinheiten unterdrückt, die Kopf sagte umfassen, aber ich habe nicht, welche ihrer unzähligen Überschriften können sich an Fehler bestimmt.

So, wie jedes anderes Programmierproblem, ich mag, indem Sie eine binäre Suche starten, die aktuelle Warnstufe Ausdruck und wenn möglich irgendwelche unterdrückt Warnungen in meinem Haupt Pre Compiled-Header.

Hat jemand wissen, welche Richtlinie Compiler ich könnte, oder was Ansatz könnte ich in der Lage sein zu tragen, dass würde mir diese Informationen?

Ich kann Ihnen nicht sagen, wie widerlich es, dass meine sorgfältig konstruierte Typdeklarationen in meinem Header einer Compiler-Warnung zu geben, scheitern zu finden ist, wenn ein Anrufer den Vertrag verletzt und versucht, mir anstelle einem signierten Byte eine ganze Zahl zu senden (das hat führte zu den aktuellen Fehlern zu lösen ich versuche).

Die Gedanken?

NOTES:

Suchen auf Pragma durch meine gesamte Lösung kommen mit nur ausgewogenen Erklärungen #pragma warning (disable: xxxx), gefolgt von Pragma Warnung (Standard: xxxx). Und keiner von denen, Referenz 4244.

Suchen auf 4244 während der gesamten Lösung keine Treffer zurückgeben (ich nie diese Warnung außer Kraft setzen, noch irgendwelche meiner eingebundenen Bibliotheken, Teilprojekte, usw.).

Suchen auf 4244 während des gesamten MS umfassen Pfade ein paar Hinweise Gegenzug, dass erscheinen sein, ausgeglichen, oder fast so, je nach den #define Symbolen, die sie vor dem Aufruf eingestellt wurden. Daher mein Verdacht, dass MS fehlerhaft ist (in Verbindung mit der Vorgeschichte der MS zu tun schlampige Arbeit in ihrem Header).

War es hilfreich?

Lösung 4

Nach einer weiteren Untersuchung:

/ P dauert zu lange (ich erleben es nie mehr als ein paar Dateien im Laufe der fast eine Stunde bekommen, so annullierte ich das Build)

war ich nie, was die aktuelle Warnstufe auszudrucken einen klaren Weg zu finden, die Lage war, oder bei einer Überschreibung, die an einem bestimmten Punkt in der Zusammenstellung in Kraft waren. So ist die Frage, die ich fragte nicht wirklich beantwortet, es sei denn, der / P Argument tatsächlich nützlich ist für Sie (wie ich bereits erwähnt, war es unpraktisch für meine Zwecke).

Was konnte ich tun war, einige Inline-Anrufe in den verschiedenen Header zu konstruieren, die die erforderlichen erzeugen sollen Warnung, wenn die Warnstufe enthielt, dass als aktive Warnung, um zu überprüfen, ob diese Warnung aktiv war oder nicht:

inline int test (char value) {return ++ Wert; }

ist "etwas"

inline int test1 (int value) {return Test (Wert); } // sollte C4244 generieren -. Möglichen Datenverlust, wenn die vorherigen # include die Warnstufe oder Überschreibung Warnung 4244 nicht vermasseln tut

Und so weiter ...

Am Ende, was ich entdecken war, dass 4244 insbesondere einige seltsamen Regeln hat mit ihm verbunden ist, und dass es effektiv „disabled“ in alle, aber / W4 (Warnstufe 4) - der höchste Warnstufe. Da diese Warnstufe sehr, sehr empfindlich und beschwert sich über viele Dinge, die zu tun, etwas über sie auch jenseits unserer Möglichkeiten sind, wollte ich nicht aktivieren / W4.

Was ich habe stattdessen war die folgend in unserer stdafx.h PCH zu setzen:

Pragma Warnung (Fehler: 4244) // Dies ermöglicht völlig Warnungen für einen möglichen Datenverlust aufgrund implizite Typumwandlung unter allen Umständen unabhängig von der aktiven Warnstufe

Das hat funktioniert.

So, MS nicht unausgeglichen Warnung Überschreibungen in einem ihrer Dateien führen, die uns betroffen. Es war nur, dass 4244 sehr nachsichtig ist, außer bei der höchsten Warnstufe, wo es uns wirklich nützlich wird, sowieso.

Vielen Dank für Ihre Hilfe!

Andere Tipps

Eine weitere Möglichkeit ist hinzuzufügen diese

#pragma warning (defualt) 

am Anfang der Datei direkt nach dem #includes Dadurch wird die Warnung an den defualt, verwirft jede ignorieren, die aufgerufen worden sein könnte.

Auf einer anderen Note, finde ich es höchst unwahrscheinlich, dass ein Microsoft-Header eine Warnung abzuschalten würde.

Können Sie einfach eine Suche durch alle Header-Dateien für „C4244“ oder haben Sie nur Zugriff auf vorkompiliert Header-Dateien?

Sie können mit der Verwendung des / P-Compiler-Befehls starten Zeilenoption . Es gibt in einer Datei die Ausgabe des Vorprozessors. Auf diese Weise kann tatsächlich machen Sie sicher, dass sein wirklich ein Header, der die Warnung zu deaktivieren und versuchen, fügt einige Hinweise zu sammeln, wie zu dem Header es sein könnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top