Frage

Muss ich den Code verschiedene Dinge tun auf dem Betriebssystem basiert auf dem es erstellt wird. Ich bin auf der Suche nach so etwas wie folgt aus:

#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif

Gibt es eine Möglichkeit, dies zu tun? Gibt es einen besseren Weg, um die gleiche Sache zu tun?

War es hilfreich?

Lösung

Die Vordefinierte Makros für OS Website hat ein sehr komplette Liste der Kontrollen. Hier sind ein paar von ihnen, mit Links zu, wo sie gefunden sind:

Windows-

_WIN32 jeweils 32 Bit und 64 Bit
_WIN64 64 Bit nur

Unix (Linux, * BSD, Mac OS X)

Sehen Sie diese bezogene Frage auf einige der Gefahren dieser Prüfung verwendet wird.

unix
__unix
__unix__

Mac OS X

__APPLE__
__MACH__

Beide sind definiert; entweder für die Überprüfung sollte funktionieren.

Linux

__linux__
linux Obsolete (nicht konform POSIX)
__linux Veraltet (nicht POSIX-konform)

FreeBSD

__FreeBSD__

Andere Tipps

show GCC definiert unter Windows:

gcc -dM -E - <NUL:

auf Linux:

gcc -dM -E - </dev/null

Vordefinierte Makros in MinGW:

WIN32 _WIN32 __WIN32 __WIN32__ __MINGW32__ WINNT __WINNT __WINNT__ _X86_ i386 __i386

auf UNIX-Varianten:

unix __unix__ __unix

Basierend auf nadeausoftware und Lambda-Fee Antwort .

#include <stdio.h>

/**
 * Determination a platform of an operation system
 * Fully supported supported only GNU GCC/G++, partially on Clang/LLVM
 */

#if defined(_WIN32)
    #define PLATFORM_NAME "windows" // Windows
#elif defined(_WIN64)
    #define PLATFORM_NAME "windows" // Windows
#elif defined(__CYGWIN__) && !defined(_WIN32)
    #define PLATFORM_NAME "windows" // Windows (Cygwin POSIX under Microsoft Window)
#elif defined(__ANDROID__)
    #define PLATFORM_NAME "android" // Android (implies Linux, so it must come first)
#elif defined(__linux__)
    #define PLATFORM_NAME "linux" // Debian, Ubuntu, Gentoo, Fedora, openSUSE, RedHat, Centos and other
#elif defined(__unix__) || defined(__APPLE__) && defined(__MACH__)
    #include <sys/param.h>
    #if defined(BSD)
        #define PLATFORM_NAME "bsd" // FreeBSD, NetBSD, OpenBSD, DragonFly BSD
    #endif
#elif defined(__hpux)
    #define PLATFORM_NAME "hp-ux" // HP-UX
#elif defined(_AIX)
    #define PLATFORM_NAME "aix" // IBM AIX
#elif defined(__APPLE__) && defined(__MACH__) // Apple OSX and iOS (Darwin)
    #include <TargetConditionals.h>
    #if TARGET_IPHONE_SIMULATOR == 1
        #define PLATFORM_NAME "ios" // Apple iOS
    #elif TARGET_OS_IPHONE == 1
        #define PLATFORM_NAME "ios" // Apple iOS
    #elif TARGET_OS_MAC == 1
        #define PLATFORM_NAME "osx" // Apple OSX
    #endif
#elif defined(__sun) && defined(__SVR4)
    #define PLATFORM_NAME "solaris" // Oracle Solaris, Open Indiana
#else
    #define PLATFORM_NAME NULL
#endif

// Return a name of platform, if determined, otherwise - an empty string
char *
get_platform_name() {
    return (PLATFORM_NAME == NULL) ? "" : PLATFORM_NAME;
}

int main(int argc, char *argv[]) {
    puts(get_platform_name());
    return 0;
}

Getestet mit GCC und Klirren auf:

  • Debian 8
  • Fenster (MinGW)
  • Fenster (Cygwin)

In den meisten Fällen ist es besser, zu prüfen, ob eine bestimmte Funktionalität vorhanden ist oder nicht. Zum Beispiel:., Wenn die Funktion pipe() existiert oder nicht

#ifdef _WIN32
// do something for windows like include <windows.h>
#elif defined __unix__
// do something for unix like include <unistd.h>
#elif defined __APPLE__
// do something for mac
#endif

Microsoft C / C ++ Compiler (MSVC) Vordefinierte Makros finden Sie hier:

  

https://docs.microsoft.com/en-us / CPP / Präprozessor / vordefinierte-Makros

Ich glaube, Sie suchen:

  

_WIN32 - Definiert als 1, wenn das Kompilation Ziel 32-Bit-ARM ist, 64-Bit-ARM, x86 oder x64. Andernfalls undefined
  _WIN64 - definiert als 1, wenn die Kompilierung Ziel 64-Bit-ARM oder x64. Ansonsten nicht definiert.

gcc-Compiler vordefinierte Makros sind hier zu finden:

  

http://gcc.gnu.org/onlinedocs/cpp/Predefined -Macros.html

Ich glaube, Sie suchen:

  

__ GNUC__
  __GNUC_MINOR__
  __GNUC_PATCHLEVEL__

Führen Sie eine Google für Ihre entsprechenden Compiler vordefiniert.

Es gibt keinen Standard-Makro, das nach C-Standard festgelegt ist. Einige C-Compiler ein auf einigen Plattformen gesetzt wird (zum Beispiel Apples gepatcht GCC setzt einen Makro, um anzuzeigen, dass es auf einem Apple-System und für die Darwin-Plattform kompiliert). Ihre Plattform und / oder Ihre C-Compiler könnte auch etwas gesetzt, aber es gibt keine allgemeine Art und Weise.

Wie hayalci sagte, ist es am besten, diese Makros in Ihrem Build-Prozess irgendwie festgelegt haben. Es ist einfach, ein Makro mit den meisten Compiler zu definieren, ohne den Code zu modifizieren. Sie können einfach -D MACRO zu GCC passieren, d.

gcc -D Windows
gcc -D UNIX

Und in Ihrem Code:

#if defined(Windows)
// do some cool Windows stuff
#elif defined(UNIX)
// do some cool Unix stuff
#else
#    error Unsupported operating system
#endif

Auf MinGW, die _WIN32 definieren Kontrolle nicht funktioniert. Hier ist eine Lösung:

#if defined(_WIN32) || defined(__CYGWIN__)
    // Windows (x86 or x64)
    // ...
#elif defined(__linux__)
    // Linux
    // ...
#elif defined(__APPLE__) && defined(__MACH__)
    // Mac OS
    // ...
#elif defined(unix) || defined(__unix__) || defined(__unix)
    // Unix like OS
    // ...
#else
    #error Unknown environment!
#endif

Für weitere Informationen schauen Sie bitte: https://sourceforge.net/p/predef/ wiki / Betriebssysteme /

Verwenden #define OSsymbol und #ifdef OSsymbol wo OSsymbol ist ein #define'able Symbol Ihr Ziel-Betriebssystem zu identifizieren.

Normalerweise würden Sie eine zentrale Header-Datei das ausgewählte OS Symbol definieren und verwenden OS-spezifische umfassen und Bibliotheksverzeichnisse zu erstellen und zu bauen.

Sie haben es nicht geben Sie Ihre Entwicklungsumgebung, aber ich bin mir ziemlich sicher, dass Ihr Compiler global definiert für gemeinsame Plattformen und Betriebssysteme zur Verfügung stellt.

Siehe auch http://en.wikibooks.org/wiki/C_Programming/Preprocessor

Sorry für die externe Referenz, aber ich denke, es ist zu Ihrer Frage geeignet ist:

C / C ++ Tipp: Wie Sie das Betriebssystem-Typ mit Compiler vordefinierte Makros

Einige Compiler #defines erzeugen, die Ihnen dabei helfen können. Lesen Sie die Compiler-Dokumentation, um zu bestimmen, was sie sind. MSVC definiert eine, die __WIN32__ ist, GCC hat einige, die Sie mit touch foo.h; gcc -dM foo.h sehen

Sie können Pre-Prozessor-Richtlinien Warnung oder einen Fehler bei der Kompilierung zu überprüfen, müssen Sie nicht auf run dieses Programm überhaupt nur einfach Compile es.

#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__)
    #error Windows_OS
#elif defined(__linux__)
    #error Linux_OS
#elif defined(__APPLE__) && defined(__MACH__)
    #error Mach_OS
#elif defined(unix) || defined(__unix__) || defined(__unix)
    #error Unix_OS
#else
    #error Unknown_OS
#endif

#include <stdio.h>
int main(void)
{
    return 0;
}

Ich habe nicht finden Haiku Definition hier. Um vollständig zu sein, Haiku-os-Definition ist einfach __HAIKU__

Sie können mit Boost.Predef die enthält verschiedene vordefinierte Makros für die Zielplattform einschließlich des OS. Ja Schub wird oft als ein C ++ Bibliothek, aber dies ist ein Präprozessor-Header, der mit C und

funktioniert
  

definiert Diese Bibliothek eine Reihe von Compiler, Architektur, Betriebssystem, eine Bibliothek und anderen Versionsnummern aus den Informationen, die sie von C, C ++, Objective C und Objective C ++ vordefinierten Makros oder diejenigen, die in der Regel zur Verfügung Header sammeln können. Die Idee für diese Bibliothek entstand aus einem Vorschlag die Boost-Config-Bibliothek zu erweitern mehr und konsistente Informationen als die Feature-Definitionen liefern unterstützt. Was folgt, ist eine editierte Version des kurzen Vorschlag.

Zum Beispiel

#include <boost/predef.h>

#if defined(BOOST_OS_WINDOWS)
#elif defined(BOOST_OS_ANDROID)
#elif defined(BOOST_OS_LINUX)
#elif defined(BOOST_OS_BSD)
...
#endif

Ich schrieb einen kleine Bibliothek das Betriebssystem Sie sind zu bekommen, kann es sein, Verwendung installiert clib (der Paket-Manager C), so ist es wirklich einfach ist es als eine Abhängigkeit zu verwenden für Ihre Projekte.

Installieren

$ clib install abranhe/os.c

Verwendung

#include <stdio.h>
#include "os.h"

int main()
{
    printf("%s\n", operating_system());
    // macOS
    return 0;
}

Es gibt eine Zeichenfolge (char*) mit dem Namen des Betriebssystems, das Sie verwenden, um weitere Informationen zu diesem Projekt überprüfen Sie es heraus die Dokumentation auf Github .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top