How do I check OS with a preprocessor directive?

前端 未结 16 1531
星月不相逢
星月不相逢 2020-11-22 13:53

I need my code to do different things based on the operating system on which it gets compiled. I\'m looking for something like this:

#ifdef OSisWindows
// do         


        
16条回答
  •  谎友^
    谎友^ (楼主)
    2020-11-22 14:23

    Based on nadeausoftware and Lambda Fairy's answer.

    #include 
    
    /**
     * 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 
        #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 
        #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;
    }
    

    Tested with GCC and clang on:

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

提交回复
热议问题