Regarding predefined macros, there is the famous predef.sf.net.
Looking for Android brings up the devices page. There:
The following macros have to be included from the header file.
Type | Macro | Format | Description Version | __ANDROID_API__ | V | V = API Version
Android Version | __ANDROID_API__ 1.0 | 1 1.1 | 2 1.5 | 3 1.6 | 4 2.0 | 5 2.0.1 | 6 2.1 | 7 2.2 | 8 2.3 | 9 2.3.3 | 10 3.0 | 11
#ifdef __ANDROID__ # include <android/api-level.h> #endif #ifdef __ANDROID_API__ this will be contained on android #endif #ifndef __ANDROID_API__ this will NOT be contained for android builds #endif #if defined(WIN32) || defined(__ANDROID_API__) this will be contained on android and win32 #endif
If you want to include a code block for versions for a high enough version, you must first check for existence, and then you can do arithmetic comparisons:
#ifdef __ANDROID_API__ # if __ANDROID_API__ > 6 at least android 2.0.1 # else less than 2.0.1 # endif #endif
You can't do
#ifdef FOO || BAR. The standard only defines the syntax
# ifdef identifier new-line
but you can use the unary operator
#if defined(FOO) && defined(BAR)
you can also negate the result using
#if !defined(FOO) && defined(BAR) this is included only if there is no FOO, but a BAR.
and of course there's a logical-or:
#if defined(FOO) || defined(BAR) this is included if there is FOO or BAR (or both)