2012-04-11 5 views
5

Gibt es irgendwelche C++ - Kompilierzeitmakros, die vorhanden sind, um festzustellen, auf welchem ​​Windows-Betriebssystem der Code kompiliert wird. Ich möchte im Grunde nur bestimmte Funktionen auf Win7 unterstützen. Also bin ich daran interessiert, so etwas zu tunC++ Kompilierzeit Makros zum Erkennen von Windows os

#if <os_macro> = WIN7 
    // This function would do something valid only on Win7 builds. 
    bool myfunction { 
     // do something here 
    } 
#else 
    // This function would typically return false, since its not supported on OS below win7 
    bool myfunction { 
     return false; 
    } 
#endif 

Gibt es einen anderen besseren Weg, dies zu tun?

+4

Wie wird das OS auf hilfreich kompiliert? Muss es nicht wissen, auf welchem ​​Betriebssystem es läuft? –

+0

In Visual Studio können Sie '#ifdef WIN32' oder' #ifdef _WINDOWS' für plattformübergreifende verwenden. Wenn Sie nur eine Windows-Version haben wollen, definieren Sie normalerweise 'WINVER' selbst. Für Windows 7 '#define WINVER 0x0601' – AJG85

Antwort

10

Das Betriebssystem, das es wird kompiliert auf allen ist nicht so wichtig; Was mehr zählt, ist das Betriebssystem, dass der Code läuft auf, die Sie offensichtlich zur Kompilierzeit nicht erkennen können. Aber wenn Sie möchten, dass Ihr Code auf älteren Windows-Versionen läuft, können Sie WINVER and _WIN32_WINNT auf bestimmte Werte setzen, was dazu führt, dass neuere Funktionen nicht verfügbar sind usw. (Suchen Sie einfach in den Windows-Headerdateien, wo diese Makros getestet werden, um eine Idee zu bekommen).

Um die Funktionalität zur Laufzeit zu testen, verwenden Sie GetProcAddress (und möglicherweise auch LoadLibrary, wenn es in einer neueren DLL ist), um zu testen, ob die Funktion verfügbar ist. Wenn es ist, ruf es an, wenn nicht, tu es nicht.

Siehe auch die predefined macros von dem Visual Studio-Compiler verwendet, wenn Sie die Compiler-Version usw.

+0

Grundsätzlich sollte ich in der Lage sein zu sagen, das ist eine Win7-Build, die bestimmte Fähigkeit hat, und das ist eine WinXP-Build, die nicht funktioniert. Hier würde ich definieren, was die Fähigkeit sein sollte. – Rajiv

+3

Warum möchten Sie separate Builds?Warum haben Sie nicht einen Build, der sich je nachdem, auf welchem ​​Betriebssystem er läuft, anders verhält? –

+0

Danke. Verstanden, was ich falsch gemacht habe. – Rajiv

0

Zumindest mit MS VC++, WIN32, _WIN32 und _WIN32_WINNT, für Anfänger. Wenn Sie es nicht zur Kompilierungszeit steuern müssen, sollten Sie möglicherweise mithilfe von GetVersionEx zur Laufzeit feststellen, dass das gleiche Build auf älteren Versionen ausgeführt wird, aber neue Funktionen nutzt, wenn sie verfügbar sind.

1

Es gibt eine Reihe von Standard-windows header macros Sie die genaue Version des OS zu sagen

+0

Wie mache ich diese Makros, um die Vergleiche zu machen? Ich habe versucht mit Winver wie dieses #if WINVER> = _WIN32_WINNT_WIN7, aber es hat nicht sehr gut funktioniert. – Rajiv

0

Meine zwei Cent für die Menschen zu erkennen, die kompilieren wollen/include unterschiedlich zwischen Konsole und WIN32 App unter Visual Studio (2017) in meinem Fall.

Sie Sie Assistenten verwenden, um eine Konsolenanwendung zu erstellen, müssen Sie:

WIN32; _DEBUG; _CONSOLE;% (PreprocessorDefinitions)

unter: enter image description here

Wenn Sie Assistenten für win32 GUI A pp:

WIN32; _DEBUG; _WINDOWS;% (PräprozessorDefinitions) also keine _CONSOLE.

enter image description here

so können Sie schreiben:

#ifdef _CONSOLE 
// for Console 
#else 
// for GUI 


#endif // _CONSOLE 



int main() 
{ 
#ifdef _CONSOLE 
    // for Console 
#else 
    // for GUI 


#endif // _CONSOLE 


    return 0; 
}