2012-04-13 5 views
-1

Ich versuche, vorhandene C++ 32-Code auf 64-Code auf Windows7 mit Visual Studio 2010 zu migrieren. Nie zuvor 64-Bit-Kompilierung zuvor. Mit Hilfe von Internet-Referenzen habe ich das Setup für 64-Bit-Compilation gemacht. wie VS2010 mit 64-Bit-Compiler etc und anderen Konfigurationsänderungen. Im Präprozessor habe ich WIN32 entfernt und WIN64 hinzugefügt. Ich habe einige andere Pre-Prozessoren wie OS_WIN_32 und einige andere, die in meinem Code spezifisch sind. In dem Code, wo immer WIN32 verwendet wurde, fügte ich zusätzliche Bedingung als || hinzu WIN64 dies ist nur um sicherzustellen, dass die Anwendung mit win32 sowie win64 kompiliert werden soll. Wenn ich versuche, den Code Ich erhalte die Kompilierungsfehler sagenProbleme bei der Migration 32-Bit-Anwendung auf 64-Bit

fatal error C1189 zu kompilieren: #error: Nur eine der WIN32 und WIN64 Symbole sollten

dieser Fehler definiert werden aus dem lokalen Code kommt wo wir überprüfen, ob WIN32 und WIN64 definiert sind. Dieser Code ist wie folgt.

in VS2010 Wenn Makros nicht aktiviert sind, wird der Code innerhalb des Makros ausgegraut. In meinem Code ist auch der obige Fehler ausgegraut. aber ich bekomme immer noch diesen Fehler.

Der Code, in dem ich WIN64 hinzufügte, schließt windows.h ein. als Referenz givine es unten.

#if defined WIN32 || defined WIN64 
#include <windows.h> 
#include <process.h> 
#endif 

Also meine Frage ist, warum ich diesen Fehler bekomme? sollten wir Windows.h für 64-Bit-Kompilierung nicht hinzufügen? Ich habe versucht, diese Aufnahme zu kommentieren, aber ich bekomme andere Fehler in Bezug auf HANDLE, die im Code verwendet werden. Wenn ich zur WIN32-Definition gehe, zeigt VS2010 auf eine Definition in der Datei windef.h. Diese Datei ist im Ordner Microsoft SDKs \ Windows \ v7.0A \ include enthalten, d. H. Nicht in meinem lokalen Code. für den Bezug ist diese Definition unten angegeben.

#ifndef WIN32 
#define WIN32 
#endif 

Also ich möchte wissen, warum Compiler beide Pre-Prozessoren WIN32 und WIN64 erhält.

Vielen Dank im Voraus für Ihre Hilfe.

+0

Try-Look "Lessons auf die Entwicklung von 64-Bit-C/C++ Anwendungen" - http://www.viva64.com/en/l/ und "Verwenden von _WIN64/WIN64-Makros" - http://www.viva64.com/en/k/0040/ –

Antwort

6

Sie sollten auch nicht selbst definieren. Die Makros, die verwendet werden sollte, um dies zu überprüfen sind

_WIN32 // always defined for Windows apps 
_WIN64 // only defined for x64 compilation 

Diese durch den Compiler definiert werden (siehe here).

Oft fügt die IDE die Makros ohne Präfix der Befehlszeile hinzu, damit ältere Projekte, die die nicht dokumentierten nicht vordefinierten Versionen verwenden, nicht erstellt werden können. Die Tatsache, dass sie funktionieren, ist kein Grund, sie zu verwenden, wenn dokumentierte Alternativen vorhanden sind.


Es läuft darauf hinaus, diese nach unten:

#ifdef _WIN32 
    // We're on Windows, yay! 
#ifdef _WIN64 
    // We're on x64! Yay! 
#else // _WIN64 
    // We're on x86 (or perhaps IA64, but that one doesn't matter anymore). Yay! 
#endif // _WIN64 
#else // _WIN32 
    // We're not on Windows, maybe WindowsCE or WindowsPhone stuff, otherwise some other platform 
#endif 
+0

Ich bin mir nicht sicher, ob ich Ihre Erklärung verstehe oder nicht. aber ich habe _WIN64 nicht hinzugefügt. Ich habe WIN64 hinzugefügt, da der vorhandene Code WIN32 verwendet (beide sind ohne Unterstreichung), selbst die WIN32-Definition in der Datei "windef.h" stammt ebenfalls von Microsoft SDKs. Wenn ich deine Erklärung falsch verstanden habe, kannst du das bitte im Detail erklären. Entschuldigung für Unannehmlichkeiten. Danke – novice

+0

@novice siehe bearbeiten. – rubenvb

+0

yeh, nachdem ich Tour erste Antwort Lesen des Codes bearbeitet, wie unten gezeigt #IF _WIN32 definiert && definiert _WIN64 #error Nur einer der WIN32 und WIN64 Symbole sollten #endif noch i den gleichen Fehler habe definiert werden. Eine weitere Abfrage nach dem Anzeigen der bearbeiteten Antwort ist x64-Code wird immer _WIN32 und _WIN64 definiert haben. ist dieses Verständnis richtig? Wenn ja, dann ist es nicht die korrekte Kodierung, wenn der Code einen Fehler erzeugt, wenn beide definiert sind. Ist das richtig? – novice