Warnung C4099: Typ Name zuerst unter Verwendung von ‚Klasse‘ gesehen jetzt ‚struct‘ gesehen Verwendung (MS VS 2K8)

StackOverflow https://stackoverflow.com/questions/468486

  •  19-08-2019
  •  | 
  •  

Frage

Ist diese Warnung etwas zu befürchten? Ich habe gelesen, dass es zu Fehlfunktionen führen kann?

Es ist ein Beispiel, das ich zu kompilieren bin versucht, könnte mir jemand erklären, warum der Autor das entsprechende Objekt als eine Klasse erklärt aber dann ist typedef es auf eine Struktur? Ist es völlig normal, so zu tun, wenn die Klasse POD ist?

Danke.

War es hilfreich?

Lösung

Diese Warnung wird angezeigt, wenn Sie eine eine Typdeklaration, die eine anderer Widerspruch (man sagt „Klasse“, der andere sagt: „Struktur“). In Anbetracht der eine Definition der Regel alle Erklärungen mit Ausnahme von höchstens muss man vorwärts Erklärungen sein. Die Warnung wird in der Regel zeigen, dass eine Vorwärts-Deklaration einer Art falsch ist und ist in der Regel ein einfacher Tippfehler und soll behoben werden. In diesem Fall sollte es keine Nebenwirkungen, aber man sollte es wirklich beheben.

Es kann aber sein, einige sehr unangenehme Dinge passieren, wenn Sie Typ Namenskonflikte (möglicherweise verursacht durch „using namespace“ Klauseln oder globalen Namensraum Verschmutzung verwenden) haben. Diese Warnungen werden könnten darauf hinweisen, dass Sie Header aus zwei verschiedenen Bibliotheken und die Typnamen haben Auseinandersetzungen mischen. Code unter diesen Bedingungen zusammengestellt kann einige sehr unerwartete Dinge tun.

Mein Rat - verstehen, warum die Warnung erschienen ist und beheben. Wenn die Warnung in einem Drittprodukt ist, besteht darauf, dass sie es zu beheben.

Andere Tipps

Sie einfach den Kommentar zu bringen, indem MSalters gegen diese Beitrag oben auf der obersten Ebene. Ich habe mehrere Fest mußte Linkerfehler als Folge von VC mit der ‚Klasse‘ oder ‚Struktur‘ Keyword in seinen Mangeln von Namen finden.

Wenn Sie nicht erwarten, dass es ein Problem sein, das Sie gelassen werden können Ihren Kopf stundenlang kratzen!

Ich diskutiere diese Warnung in der Tiefe in meinem Blog-Posting " Ist C4099 wirklich ein sillywarning?" . Meine Schlussfolgerung ist, dass es am besten ist ausgeschaltet. :-) Na ja, zumindest für mich.

Richard Corden ist richtig - es gibt einen Grund MS diese Warnung hat. Für die MS-Compiler, verziert (verstümmelte) Namen enthalten, die Klasse-Taste (struct oder class) verwendet wird, eine Art zu erklären. Wenn eine Funktion, die einen Gegenstand als Argument oder kehrt das Objekt irgendwo referenziert wird, wenn die falsche Klasse-Taste sichtbar ist, werden Sie nicht einen Compiler-Fehler erhalten, aber der Linker wird sich beschweren, weil die ergänzten Namen unterscheiden. Der Linker Fehler zeigt nur das Symbol es sucht, und es ist einfach, den Klasse-Schlüssel Mismatch dort zu übersehen, so die frühere, ausführlichere Compiler-Warnung ist wertvoll. Es ist immer noch möglich, dass die beiden Versionen in derselben Übersetzungseinheit nicht angezeigt werden, natürlich, und Sie werden wahrscheinlich den Kopf für eine Weile kratzen, wenn Sie, dass der einzige Unterschied glauben Standardelement Sichtbarkeit.

Der Unterschied in Konflikten mit dem C ++ Standard Mangeln, die besagen, dass nach vorn Erklärungen wie struct Foo; und class Foo; gleichwertig sind, und so sollen die gleichen Mangeln verwenden.

Obwohl diese schlechte Praxis betrachtet wird, ich denke, es sollte kein Problem sein Mischklassendefinition und Strukturdeklaration, wie sie Art im Grunde die gleichen Daten sind. Der wesentliche Unterschied besteht darin, dass Strukturkomponenten standardmäßig öffentlich ist, im Gegensatz zu den Teilnehmern, die privat sind, aber ansonsten ist das Speicherlayout ist identisch.

Eine Sache, die ich gesehen habe, dass diese Warnung kann dazu führen, versucht die TLB-Datei aus einer DLL #import während auch die gleiche DLL als Referenz in Ihrem Projekt hat. Ich reparierte nur ein Problem mit diesem durch die DLL als Referenz aus meinem Projekt zu entfernen.

In c ++ der nur Unterschied zwischen einer Klasse und einer Struktur ist, dass Klasse Membervariablen, Elementfunktionen und Basisklassen sind standardmäßig privat, während in einer Struktur sie standardmäßig öffentlich ist; so die Tatsache, dass die Klasse POD sollte keinen Unterschied machen.
Ich würde vermuten, dass diese Warnung von Code Wartung kommt (Definition irgendwo aktualisiert, aber nicht woanders) und den Code zu beheben, so dass die Warnung verschwindet (z Klasse in der typedef).

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