Which macro to wrap Mac OS X specific code in C/C++

c, c++, macos, macros, xcode

Solution

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.

Problem

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?

Original source