我需要我的代码做不同的事情基础的操作系统,它得到编制。我在寻找像这样的东西:

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

有没有办法做到这一点?是否有更好的方式做同样的事情吗?

有帮助吗?

解决方案

预定义的操作系统宏 网站有一个非常完整的支票清单。以下是其中的一些内容,以及指向它们的位置的链接:

Windows

_WIN32     32位和64位
_WIN64     64 bit only

Unix(Linux,* BSD,Mac OS X)

请参阅此相关问题,了解使用此支票的一些缺陷。

<代码> UNIX 结果 <代码> __ UNIX 结果 <代码> __ UNIX __

Mac OS X

<代码> __ APPLE __ 结果 <代码> __ MACH __

两者都是定义的;检查要么应该工作。

Linux

<代码> __的Linux __ 结果 linux 已过时(不符合POSIX)
__ linux 已过时(不符合POSIX)

FreeBSD

<代码> __的FreeBSD __

其他提示

在Windows上显示GCC定义:

gcc -dM -E - <NUL:
Linux上的

gcc -dM -E - </dev/null

MinGW中的预定义宏:

WIN32 _WIN32 __WIN32 __WIN32__ __MINGW32__ WINNT __WINNT __WINNT__ _X86_ i386 __i386

在UNIX上:

unix __unix__ __unix

基于上 nadeausoftwareLambda童话的回答.

#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;
}

测试与海湾合作委员会和铛:

  • Debian8
  • Windows(MinGW)
  • Windows(Cygwin)

在大多数情况下,最好检查是否存在给定的功能。例如:如果函数 pipe()存在或不存在。

#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 ++编译器(MSVC)预定义宏可在此处找到:

  

https://docs.microsoft.com/en-us / CPP /预处理器/预定义的宏

我认为你在寻找:

  

_WIN32 - 当编译目标是32位ARM,64位ARM,x86或x64时定义为1。否则,未定义的
  _WIN64 - 当编译目标是64位ARM或x64时定义为1。否则,未定义。

gcc编译器PreDefined MAcros可以在这里找到:

  

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

我认为你在寻找:

  

__ GNUC__结果   __GNUC_MINOR__结果   __GNUC_PATCHLEVEL__结果

为您预先定义的相应编译器做谷歌。

没有根据C标准设置的标准宏。有些C编译器会在某些平台上设置一个(例如Apple的补丁GCC设置一个宏来表示它正在Apple系统和Darwin平台上进行编译)。您的平台和/或C编译器也可以设置一些东西,但没有通用的方法。

就像hayalci所说,最好在构建过程中以某种方式设置这些宏。在不修改代码的情况下,很容易用大多数编译器定义宏。您只需将 -D MACRO 传递给GCC,即

gcc -D Windows
gcc -D UNIX

在您的代码中:

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

在MinGW上, _WIN32 定义检查不起作用。这是一个解决方案:

#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

有关详细信息,请参阅: https://sourceforge.net/p/predef/维基/ OperatingSystems /

使用 #define OSsymbol #ifdef OSsymbol 其中OSsymbol是识别目标操作系统的 #define '符号。

通常,您将包含一个定义所选OS符号的中央头文件,并使用特定于操作系统的include和库目录进行编译和构建。

您没有指定开发环境,但我非常确定您的编译器为常见平台和操作系统提供了全局定义。

另见 http://en.wikibooks.org/wiki/C_Programming/Preprocessor

很抱歉外部参考,但我认为它适合您的问题:

C / C ++提示:如何使用编译器预定义宏检测操作系统类型

有些编译器会生成#defines来帮助你解决这个问题。阅读编译器文档以确定它们是什么。 MSVC 定义了一个 __ WIN32 __ ,< a href =“https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html"rel =”nofollow noreferrer“> GCC 有一些你可以看到 touch foo.h; gcc -dM foo.h

您可以使用预处理器指令作为 警告或错误 在编译时检查您是否需要运行这个程序根本就是编译它。

#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;
}

我在这里找不到 Haiku 的定义。要完成,Haiku-os定义很简单 __ HAIKU __

您可以使用 Boost.Predef ,其中包含目标平台(包括操作系统)的各种预定义宏。是的boost通常被认为是一个C ++库,但这个是一个预处理程序头,也适用于C

  

该库定义了一组编译器,体系结构,操作系统,库和其他版本号,它们可以收集C,C ++,Objective C和Objective C ++预定义宏或通常可用标头中定义的宏。这个库的想法源于扩展Boost配置库以提供比它支持的功能定义更多,更一致的信息的提议。以下是该简要提案的编辑版本。

例如

#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

我写了一个小型图书馆来获取您所使用的操作系统,它可以是使用 clib (C包管理器)安装,因此将它用作项目的依赖项非常简单。

安装

$ clib install abranhe/os.c

用法

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

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

它返回一个字符串( char * ),其中包含您正在使用的操作系统的名称,有关此项目的更多信息请查看关于Github的文档

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top