2009-06-18 3 views
1

während der Programmierung in C++, Die meisten der Zeit i ‚einige Symbole‘ bekommen haben bereits siehe vorherige Definition von ‚einiges Symbol‘siehe vorherige Definition von ‚einiges Symbol‘

Ich denke, dies geschieht, weil unsachgemäßen definiert Reihenfolge der Header-Datei enthalten.

Wie kann ich alle Definitionen von 'einigen Symbol' herauszufinden

Vielen Dank im Voraus, Uday

EDIT:

ich Visual Studio verwende ich erinnere mich einen Befehl soetwas wie dumpbin/exports (ich erinnere mich nicht genau), um alle die Definition zu erhalten

Antwort

2

Translating C++ in eine executbale hat zwei Schritte, um zu sehen. Im ersten Schritt arbeitet der Compiler linear durch die Eingaben (typischerweise CPP-Dateien und die Header, die sie enthalten). In Schritt 2 kombiniert der Linker die Ergebnisse von Schritt 1.

Aus Ihrer Beschreibung „Symbol vor definiert“, schließe ich, das Problem innerhalb einer CPP-Datei auftreten muss, wie die linear verarbeitet werden. dumpbin/exports arbeitet mit der Ausgabe von Schritt 1, die Sie wahrscheinlich nicht haben. Header Inclusion könnte der Täter sein, da dies eine frühe Phase der Kompilierung ist. Sie möchten den vorverarbeiteten Eingang. IIRC, können Sie das mit dem/EP-Schalter bekommen.

4

Volltextsuche ist die plattformübergreifende Cross-Umwelt-und effiziente Technik dafür.

+0

+1: Einfach, aber wahr :-) Suche des Präprozessorausgabe des CPP, die zum Beispiel hat versagt. –

0

Generell grep ich nur die Header-Dateien.

2

Wenn Sie Visual Studio mit Visual Assist installiert haben, öffnet alt-G eine Liste aller Orte, an denen etwas definiert ist.

6

, die normalerweise wegen ein paar gemeinsame Probleme passiert:

  • Sie neu definieren das gleiche Symbol
  • Sie eine Header-Datei oft sind inklusive und es muss nicht enthalten Wachen
  • Sie sind falsch Vorwärts Deklaration mit einem inkompatiblen Typ und dann einschließlich

Ich würde beginnen zu versuchen, die zweite zu beheben. Stellen Sie sicher, dass alle Header Wachen enthalten, so dass, wenn man sie aus verschiedenen Orten enthalten wird es nicht versuchen, die Symbole neu zu definieren:

#ifndef HEADER_FILE_NAME_GUARD // or something alike 
#define HEADER_FILE_NAME_GUARD 
// rest of file 
#endif 

Wenn Sie bestellen Ihre enthält, dann werden Sie in Schwierigkeiten laufen später machen sicher, dass Sie alle Ihre Abhängigkeiten an allen Orten berücksichtigen können. (Oder vorwärts erklären, wenn Sie können)

+0

BTW, wenn er Visual Studio Env verwendet. Wenn Sie eine neue Header-Datei mit ihrem Assistenten erstellen, erstellt sie automatisch Header-Wächter. Für ihn scheint dies ein Problem des schlechten Designs zu sein. – Aamir

+0

Das auf der ziemlich große Annahme beruht, dass er tatsächlich einen Assistenten verwendet seine Header-Dateien zu generieren. – jalf

1

Wenn Sie bestellen müssen, ist es ein Hinweis auf "Code Smell" an erster Stelle. Höchstwahrscheinlich ist Ihr Code nicht gut genug entworfen. All Ihr gemeinsamer Code sollte Teil eines separaten Pakets/dll/lib (was auch immer) sein und sollte von dort enthalten/verlinkt sein.

Wenn Sie in C++/VC++ sind, geschieht dies normalerweise, wenn Sie cpp & h-Dateien direkt aus anderen Projekten einbinden, anstatt eine Verknüpfung zu einer anderen Dienstprogrammbibliothek herzustellen.

Wie bereits erwähnt, wenn Sie damit leben müssen, ist die Textsuche die beste Option, aber versuchen Sie, den Code besser zu gestalten (wenn Sie können).

2

Wenn Sie Visual Studio verwenden mit Visual installiert Assist, sollten Sie besser drücken Sie Alt + X dann D alle Verweise auf das Symbol