Wie überprüfe ich das Betriebssystem mit einer Präprozessordirektive?

Lesezeit: 5 Minuten

Benutzeravatar von perimosocordiae
Perimosokordien

Ich brauche meinen Code, um verschiedene Dinge zu tun, basierend auf dem Betriebssystem, auf dem er kompiliert wird. Ich suche so etwas:

#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, dasselbe zu tun?

  • @Cory Klein: Nein-nein. Diese Frage wurde vor Jahren gestellt

    – John_West

    3. Januar 2016 um 19:53 Uhr

  • Es geht um C nicht C++

    – Ilgar

    21. Januar 2019 um 17:08 Uhr

  • Wie erkennt man zuverlässig Mac OS X, iOS, Linux, Windows in C-Präprozessor?, Erkennen Sie Windows oder Linux in C, C++

    – phuklv

    2. Juni 2019 um 15:38 Uhr

  • @CoryKlein Nein, diese Frage ist ein Duplikat dieser Frage.

    – Akib Azmain

    10. Oktober 2020 um 11:22 Uhr


  • @AkibAzmain Du hast mich zurück in die Geschichte gezogen! Wow, was für eine alte Frage. Es war schon 5 Jahre alt, als ich vor 7 Jahren das erste Mal kommentierte! Interessanterweise ist das Vergleichsalter kein endgültiges Kriterium für die Auswahl des Duplikats, aber in diesem Fall sieht es so aus, als ob das andere vor Ewigkeiten als Duplikat markiert wurde, also ist es eine strittige Frage. Haben Sie einen guten Tag!

    – Cory Klein

    10. Oktober 2020 um 12:13 Uhr

Benutzeravatar von Lambda Fairy
Lambda-Fee

Das Vordefinierte Makros für OS Website hat eine sehr vollständige Liste von Prüfungen. Hier sind einige davon, mit Links zu ihren Fundorten:

Fenster

_WIN32 Sowohl 32-Bit als auch 64-Bit
_WIN64 Nur 64-Bit
__CYGWIN__

Unix (Linux, *BSD, aber nicht Mac OS X)

Sehen Sie sich diese verwandte Frage zu einigen Fallstricken bei der Verwendung dieser Prüfung an.

unix
__unix
__unix__

Mac OS X

__APPLE__ Wird auch für Klassik verwendet
__MACH__

Beide sind definiert; Die Überprüfung auf beide sollte funktionieren.

Linux

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

FreeBSD

__FreeBSD__

Android

__ANDROID__

  • Diese Seite enthält kein iOS, daher kann sie nicht zwischen iOS und OS X unterscheiden.

    – Gary Makin

    30. April 2014 um 5:40 Uhr

  • Mac OS definiert nicht __unix__. Warum würden Sie es in die Liste aufnehmen?

    – Viktor Sergijenko

    19. April 2018 um 6:35 Uhr


  • cpp -dM /dev/null gibt Ihnen eine Liste aller von gcc vordefinierten Makros in Ihrer Version von installiertem gcc

    – katta

    10. September 2018 um 16:26 Uhr

  • Cygwin definiert die unix Symbole und definiert nicht die win32 diejenigen, also seien Sie vorsichtig. OTOH definiert es __CYGWIN__.

    – David gegeben

    24. September 2018 um 19:43 Uhr

  • ist __linux__ gleich wie __ANDROID__ ??

    Benutzer10146018

    9. März 2020 um 20:04 Uhr


Benutzeravatar von qwer
qwer

show GCC definiert unter Windows:

gcc -dM -E - <NUL:

unter Linux:

gcc -dM -E - </dev/null

Vordefinierte Makros in MinGW:

WIN32 _WIN32 __WIN32 __WIN32__ __MINGW32__ WINNT __WINNT __WINNT__ _X86_ i386 __i386

auf UNIXen:

unix __unix__ __unix

  • Windows und Unices sind nicht die einzigen Betriebssysteme

    – phuklv

    24. Februar 2019 um 12:30 Uhr

  • Das ist praktisch, aber beachten Sie das unix, __unix__, __unix funktioniert nicht unter macOS, wo nur __APPLE__ und __MACH__ sind festgelegt.

    – melement0

    7. Juni 2021 um 15:35 Uhr

Benutzeravatar von PADYMKO
PADYMKO

Bezogen auf nadeausoftware und die Antwort von Lambda Fairy.

#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
const 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 Clang on:

  • Debian 8
  • Windows (MinGW)
  • Windows (Cygwin)

  • der liebe @MD XF, geben Sie bitte die Versionen Ihres Windows, MinGW und Cygwin an

    – PADYMKO

    8. März 2017 um 8:40 Uhr

  • Windows 7 Enterprise 6.1.7601. Cygwin 2.7.0-1. Ich kann die MinGW-Version nicht finden, aber ich habe sie gestern heruntergeladen.

    – MDXF

    8. März 2017 um 15:28 Uhr


  • Sie sollten jedoch darauf aufmerksam gemacht werden – dieses Programm ist Standard-C, daher sollte es auf allen kompatiblen Systemen funktionieren.

    – MDXF

    8. März 2017 um 15:28 Uhr

  • Lieber @MD XF, vielen Dank für diese Informationen. Ich habe Sie als Mitwirkenden zu dieser Antwort hinzugefügt.

    – PADYMKO

    8. März 2017 um 15:44 Uhr

Benutzeravatar von quinmars
Quinmare

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.

Benutzeravatar von Arjun Sreedharan
Arjun Sreedharan

#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

Benutzeravatar der Community
Gemeinschaft

Microsoft C/C++ Compiler (MSVC) Vordefinierte Makros können gefunden werden hier

Ich denke du suchst:

  • _WIN32 – Als 1 definiert, wenn das Kompilierungsziel 32-Bit-ARM, 64-Bit-ARM, x86 oder x64 ist. Ansonsten undefiniert
  • _WIN64 – Als 1 definiert, wenn das Kompilierungsziel 64-Bit-ARM oder x64 ist. Ansonsten undefiniert.

gcc-Compiler Vordefinierte MACros können gefunden werden hier

Ich denke du suchst:

  • __GNUC__
  • __GNUC_MINOR__
  • __GNUC_PATCHLEVEL__

Machen Sie eine Google-Suche nach Ihren passenden Compilern vordefiniert.

Auf MinGW, der _WIN32 Die Definitionsprüfung funktioniert nicht. 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

Weitere Informationen finden Sie unter: https://sourceforge.net/p/predef/wiki/OperatingSystems/

  • beste Antwort, da es Cygwin abdeckt.

    – Merkur

    28. Februar um 6:46 Uhr

1426730cookie-checkWie überprüfe ich das Betriebssystem mit einer Präprozessordirektive?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy