我希望我的代码能够根据编译所在的操作系统执行不同的功能。我正在寻找类似于以下代码:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
有没有一种方法可以做到这一点?是否有更好的方法来完成同样的事情?
我希望我的代码能够根据编译所在的操作系统执行不同的功能。我正在寻找类似于以下代码:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
有没有一种方法可以做到这一点?是否有更好的方法来完成同样的事情?
操作系统预定义宏网站提供了一个非常完整的检查列表。以下是其中一些检查项,附带它们的链接:
_WIN32
32位和64位
_WIN64
仅64位
__CYGWIN__
请参阅这个相关问题,了解使用此检查时可能会遇到的一些问题。
unix
__unix
__unix__
__APPLE__
也用于旧版系统
__MACH__
两者都定义了;检查任何一个都应该可以工作。
__linux__
linux
已过时(不符合POSIX标准)
__linux
已过时(不符合POSIX标准)
__FreeBSD__
__ANDROID__
__unix__
。你为什么要把它包含在列表中呢? - Victor Sergienkounix
符号,但未定义win32
符号,因此请小心。另一方面,它确实定义了__CYGWIN__
。 - David Given显示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
unix
、__unix__
和 __unix
,只定义了 __APPLE__
和 __MACH__
。 - mklement0gcc
命令时,会显示error: unrecognized command-line option ‘-q’
,这是因为在gcc -dM -E - </dev/null
命令中使用了不被识别的选项-q
。 - undefined根据nadeausoftware和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;
}
已在以下平台上使用GCC和clang进行测试:
_WIN64
就永远无法被定义,因为 _WIN32
已经被定义了。 - not2qubit_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/wiki/OperatingSystems/
在大多数情况下,最好检查给定的功能是否存在。例如:检查函数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
-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
Boost.Predef
,其中包含各种针对目标平台的预定义宏,包括操作系统(BOOST_OS_*
)。是的,Boost通常被认为是一个C++库,但这个库是一个预处理器头文件,也适用于C语言!
例如:该库根据C、C++、Objective C和Objective C++预定义的宏或通用可用头文件中定义的宏收集一组编译器、架构、操作系统、库和其他版本号。这个库的想法源于扩展Boost Config库以提供比其支持的功能定义更多、更一致信息的建议。以下是该简短提案的编辑版本。
#include <boost/predef.h>
// or just include the necessary header
// #include <boost/predef/os.h>
#if BOOST_OS_WINDOWS
#elif BOOST_OS_ANDROID
#elif BOOST_OS_LINUX
#elif BOOST_OS_BSD
#elif BOOST_OS_AIX
#elif BOOST_OS_HAIKU
...
#endif
BOOST_OS
操作系统宏中找到。
另请参阅如何从boost获取平台ID?
很抱歉要引用外部参考,但我认为这对你的问题很合适:
C
而不是C++
。 - ilgaar