While reading various C and C++ sources, I have encountered two macros __APPLE__
and __OSX__
. I found plenty of use of __OSX__
in various codes, especially those originating from *BSD
systems.
However, sometimes I find that testing __OSX__
only is not sufficient and I have to complete tests with __APPLE__
macro.
The Porting Command Line Unix Tools to Mac OS X guides specifies __APPLE__
and additionally __APPLE_CC__
but does not mention __OSX__
.
The Porting from GCC guide says:
- Use
#ifdef __GNUC__
to wrap any GCC-specific code.- Use
#ifdef __APPLE_CC__
to wrap any Mac OS X-specific code.
Again, no mention about __OSX__
macro.
What macro is predefined on Mac OS X platform and XCode development environment that should be used to distinguish OSX-specific code in C/C++ programs?
Where is the __OSX__
macro defined? Is it *BSD
specific macro?
It all depends.
Each macro specifies something different in meaning.
See: https://developer.apple.com/library/mac/documentation/Porting/Conceptual/PortingUnix/compiling/compiling.html#//apple_ref/doc/uid/TP40002850-SW13
__APPLE__
This macro is defined in any Apple computer.
__APPLE_CC__
This macro is set to an integer that represents the version number of the compiler. This lets you distinguish, for example, between compilers based on the same version of GCC, but with different bug fixes or features. Larger values denote later compilers.
__OSX__
Presumably the OS is a particular variant of OS X
So given the above definitions I would use __APPLE__
to distinguish apple specific code.