Frage

In einer C ++ Funktion brauche ich die Compiler einen anderen Block zu wählen, wenn es für eine 64-Bit-Architektur kompiliert.

Ich kenne einen Weg, um es für MSVC zu tun ++ und g ++, also werde ich per Post als Antwort. Allerdings würde ich gerne wissen, ob es einen besseren Weg ist (elegantere, die für alle Compiler / alle 64-Bit-Architekturen funktionieren würde). Wenn es nicht ein besserer Weg, was andere vordefinierte Makros soll ich suchen, um mit anderen Compiler / Architekturen kompatibel zu sein?

War es hilfreich?

Lösung

Warum wählen Sie einen Block über die andere? Wenn Sie Ihre Entscheidung über die Größe eines Zeigers basiert, verwenden sizeof(void*) == 8. Wenn Sie Ihre Entscheidung über die Größe einer ganzen Zahl basiert, verwenden sizeof(int) == 8.

Mein Punkt ist, dass der Name der Architektur selbst selten einen Unterschied machen sollte. Sie überprüfen nur das, was Sie überprüfen müssen, für die Zwecke von dem, was Sie tun werden. Ihre Frage bezieht sich nicht ganz klar, was Ihr Zweck der Prüfung ist. Was Sie fragen, ist vergleichbar mit dem Versuch, zu bestimmen, ob DirectX durch Abfragen der Windows-Version installiert ist. Sie haben mehr tragbar und allgemeine Werkzeuge zur Verfügung.

Andere Tipps

Eine Architektur-unabhängige Art und Weise 32-Bit- und 64-Bit in C und C ++ baut zu erkennen, sieht wie folgt aus:

// C
#include <stdint.h>

// C++
#include <cstdint>

#if INTPTR_MAX == INT64_MAX
// 64-bit
#elif INTPTR_MAX == INT32_MAX
// 32-bit
#else
#error Unknown pointer size or missing size macros!
#endif

Dies funktioniert für MSVC ++ und g ++:

#if defined(_M_X64) || defined(__amd64__)
  // code...
#endif
#ifdef _LP64

Arbeiten auf beiden Plattformen

Wenn Sie für die Windows-Plattform sind kompilieren, sollten Sie verwenden:

#ifdef _WIN64

Der MSVC Compiler legt fest, dass für beide x64 und ia64-Plattformen (Sie wollen nicht, dass der Markt auszuschneiden, nicht wahr?). Ich bin mir nicht sicher, ob gcc tut das gleiche - aber es sollte, wenn es nicht

.

Eine Alternative ist,

#ifdef WIN64

, die hat einen feinen Unterschied. WIN64 (ohne den Unterstrich) durch das SDK (oder der Build-Konfiguration) definiert sind. Da dies durch die SDK / Build-Konfiguration definiert ist, sollte es mit gcc genauso gut funktionieren.

Wenn Ihr Windows verwenden, ist Du besser wahrscheinlich die „PROCESSOR_ARCHITECTURE“ Umgebungsvariablen aus der Registry zu erhalten, weil sizeof (PVOID) wird 4 gleich wenn sie ein 32-Bit-Prozess auf einem 64-Bit-Betriebssystem ausgeführt wird (auch bekannt als WOW64):

    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SYSTEM\CurrentControlSet\\Control\\Session Manager\\Environment"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
        LPSTR szArch = new CHAR[100];

        ZeroMemory(szArch, 100);

        if (RegQueryValueEx(hKey, _T("PROCESSOR_ARCHITECTURE"), NULL, NULL, (LPBYTE)szArch, &dwSize) == ERROR_SUCCESS) {
            if (strcmp(szArch, "AMD64") == 0)
                this->nArchitecture = 64;
            else
                this->nArchitecture = 32;
        } else {
            this->nArchitecture = (sizeof(PVOID) == 4 ? 32 : 64);
        }

        RegCloseKey(hKey);
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top