How do I check OS with a preprocessor directive? How do I check OS with a preprocessor directive? c c

How do I check OS with a preprocessor directive?


The Predefined Macros for OS site has a very complete list of checks. Here are a few of them, with links to where they're found:

Windows

_WIN32   Both 32 bit and 64 bit
_WIN64   64 bit only
__CYGWIN__

Unix (Linux, *BSD, but Mac OS X)

See this related question on some of the pitfalls of using this check.

unix
__unix
__unix__

Mac OS X

__APPLE__ Also used for classic
__MACH__

Both are defined; checking for either should work.

Linux

__linux__
linux Obsolete (not POSIX compliant)
__linux Obsolete (not POSIX compliant)

FreeBSD

__FreeBSD__

Android

__ANDROID__


show GCC defines on Windows:

gcc -dM -E - <NUL:

on Linux:

gcc -dM -E - </dev/null

Predefined macros in MinGW:

WIN32 _WIN32 __WIN32 __WIN32__ __MINGW32__ WINNT __WINNT __WINNT__ _X86_ i386 __i386

on UNIXes:

unix __unix__ __unix


Based on nadeausoftware and Lambda Fairy's answer.

#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 stringconst char *get_platform_name() {    return (PLATFORM_NAME == NULL) ? "" : PLATFORM_NAME;}int main(int argc, char *argv[]) {    puts(get_platform_name());    return 0;}

Tested with GCC and clang on:

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