E2177 Redeklaration von #pragma package mit verschiedenen Argumenten (C++)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Compiler-Fehler und -Warnungen (C++) - Index

Der Fehler E2177 tritt typischerweise auf, wenn #pragma package(smart_init) in einer Header-Datei verwendet wird (dies wird nicht empfohlen) und dann eine weitere Anweisung #pragma package(smart_init) in einem Quellmodul vorkommt, das die Header-Datei (#include) einbezieht. Die verschiedenen Argumente, auf die der Fehler verweist, sind die Dateinamen der Header- und der Quelldatei. Der Compiler kann nicht feststellen, welcher Unit-Name verwendet werden soll.

Weitere Einzelheiten

#pragma package(smart_init) weist den Compiler an, dem Linker mitzuteilen, dass es sich um eine Unit handelt. Der Compiler führt dies durch Generieren zweier Kommentar-Records durch: Ein Record gibt den Namen der Unit an und ein Record die Flags der Unit. Durch Ausführen von tdump.exe für die Objektdatei können Sie dies überprüfen.

Bei der Verarbeitung von "Unit"-Objektdateien führt der Linker weitere Analysen durch, um die Reihenfolge zu bestimmen, in der globale Objekte der Units initialisiert werden sollen. Zur Berechnung der Reihenfolge sucht der Linker nach Referenzen auf andere "Unit"-Objektdateien. Falls zirkuläre Abhängigkeiten zwischen Objekten bestehen, ist deren Reihenfolge nicht definiert. Zudem kann die "Unit"-Semantik die Reihenfolge ändern, in der globale Objektkonstruktoren und #pragma startup/exit-Routinen aufgerufen werden. Wenn Ihr Code keine in Delphi-Units deklarierten Symbole enthält (wie VCL oder FMX) und keine Abhängigkeiten in Bezug auf die Reihenfolge der globalen Objektkonstruktion aufweist (wie der überwiegende Teil von C++-Code), dann brauchen Sie die "Unit"-Semantik wahrscheinlich nicht, und Sie können die durch Datei > Neu > Unit - C++Builder generierte #pragma package(..)-Anweisung entfernen.

Siehe auch