Identifying the target platform
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
A common problem is identifying the target platform at compile-time so that specific code can be used, perhaps to work around a quirk, or to access a non-standard feature of the target platform.
Standard compiler platform macros
The following table is a partial extract of [Pre-defined C/C++ Compiler Macros], part of a useful resource to compiler macro definitions.
Please update the table carefully with your platform or corrections:
Platform | Defined macro | Other notes |
---|---|---|
FreeBSD | __FreeBSD__ | Consider using the BSD macro |
Linux | linux or __linux | |
MacOS X | __MACOSX__ or __APPLE__ | |
NetBSD | __NetBSD__ | Consider using the BSD macro |
OpenBSD | __OpenBSD__ | Consider using the BSD macro |
Solaris | sun or __sun | SunOS versions < 5 will not have __SVR4 or __svr4__ defined |
Windows | _WIN32 or __WIN32__ |
You can use #if wrappers like:
#if defined (__FreeBSD__) ... #elif defined (__linux) || defined (linux) ... #else ... #endif
Using GNUStep-Make's support
Chris Vetter shared a tip on the use of your GNUmakefile.preamble with the following line:
ADDITIONAL_OBJCFLAGS += -D$(GNUSTEP_HOST_OS)
and then the #if wrappers will look like:
#if defined (freebsd) ... #elif defined (netbsdelf) ... #else ... #endif