ref: http://www.cplusplus.com/doc/tutorial/preprocessor/
concolusion:
directives:
#define #undef
#include
#if #else #elif #endif #ifdef #ifndef
#error ( #warning is NOT A STANDARD DIRECTIVE, since not shown in the page above, but most compilers have it. more: http://stackoverflow.com/questions/171435/portability-of-warning-preprocessor-directive )
#line
#pragma ( all compiler support #pragma to set options, but "These options are specific for the platform and the compiler you use.", so no standard options.)
macros:
__LINE__
__FILE__
__DATE__
__TIME__
(__FUNCTION__ is NOT STANDARD MACRO. __FUNCTION__ is defined on both MSVC & GCC; GCC better use __PRETTY_FUNCTION__. c99 has standard __func__)
__cplusplus (has a value to identifying C++98 / 11 )
__STD_HOSTED__
optional: __STDC__ __STDC_VERSION__ __STDC_MB_MIGHT_NEQ_WC__ __STDC_ISO_10646__ __STDCPP_STRICT_POINTER_SAFETY__ __STDCPP_THREADS__
Example of use non standard macros (compiler specific) in Blade:
1 /******************************************************************** 2 created: 2009/02/07 3 filename: Platform.h 4 author: Crazii 5 6 purpose: the platform dependent definitions 7 *********************************************************************/ 8 #ifndef __Blade_Platform_h__ 9 #define __Blade_Platform_h__ 10 11 12 /************************************************************************/ 13 /* processor unit */ 14 /************************************************************************/ 15 #define BLADE_PROCESSOR_X86 (0) 16 #define BLADE_PROCESSOR_IA64 (1) 17 #define BLADE_PROCESSOR_PPC (2) 18 #define BLADE_PROCESSOR_ARM (3) 19 20 #if defined ARM || defined __arm__ || defined _ARM 21 # define BLADE_PROCESSOR BLADE_PROCESSOR_ARM 22 23 #elif defined __ia64 || defined _M_IA64 || defined __ia64__ 24 # define BLADE_PROCESSOR BLADE_PROCESSOR_IA64 25 26 #elif defined __X86__ || defined __i386__ || defined i386 || defined _M_IX86 || defined __386__ || defined __x86_64__ || defined _M_X64 27 # define BLADE_PROCESSOR BLADE_PROCESSOR_X86 28 29 #elif defined __PPC__ || defined __POWERPC__ || defined powerpc || defined _POWER || defined __ppc__ || defined __powerpc__ || defined _M_PPC 30 # define BLADE_PROCESSOR BLADE_PROCESSOR_PPC 31 32 #else 33 # error "processor not supported yet." 34 #endif 35 36 /************************************************************************/ 37 /* this is the system specific,windows and linux, etc */ 38 /************************************************************************/ 39 40 #define BLADE_PLATFORM_WINDOWS (0) 41 #define BLADE_PLATFORM_WINPHONE (1) 42 43 #define BLADE_PLATFORM_LINUX (2) 44 #define BLADE_PLATFORM_ANDROID (3) 45 #define BLADE_PLATFORM_IOS (4) 46 #define BLADE_PLATFORM_MAC (5) 47 48 #if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) 49 50 # define BLADE_PLATFORM BLADE_PLATFORM_WINDOWS 51 52 #elif defined(WP8) && defined(_WP8) 53 54 # define BLADE_PLATFORM BLADE_PLATFORM_WINPHONE 55 56 #elif defined(ANDROID) || defined(__ANDROID__)//since android will also define __linux__, we need check android first 57 58 #define BLADE_PLATFORM BLADE_PLATFORM_ANDROID 59 60 #elif defined(__linux__) 61 62 # define BLADE_PLATFORM BLADE_PLATFORM_LINUX 63 64 #else 65 # error "current system not support yet." 66 #endif 67 68 //Careful on using those class system definition. different system may have different APIs. 69 //i.e. Unix POSIX version difference, windows Desktop/Mobile API differences. 70 71 #if defined(__unix__) 72 # define BLADE_IS_UNIX_CLASS_SYSTEM 1 73 #else 74 # define BLADE_IS_UNIX_CLASS_SYSTEM 0 75 #endif 76 77 #if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) || defined(_WIN32_WCE) || defined(WINRT) || defined(_WINRT) || defined(WP8) || defined(_WP8) 78 # define BLADE_IS_WINDOWS_CLASS_SYSTEM 1 79 #else 80 # define BLADE_IS_WINDOWS_CLASS_SYSTEM 0 81 #endif 82 83 /************************************************************************/ 84 /* Architecture (32/64 bit) */ 85 /************************************************************************/ 86 87 #define BLADE_ARCHITECTURE_32BIT (0) 88 #define BLADE_ARCHITECTURE_64BIT (1) 89 90 #if defined(__x86_64__) || defined(_M_X64) || defined(_M_IA64) || defined(_M_AMD64) || defined(__powerpc64__) || defined(__alpha__) || defined(__ia64__) || defined(__s390__) || defined(__s390x__) 91 # define BLADE_ARCHITECTURE BLADE_ARCHITECTURE_64BIT 92 # define BLADE_MEMORY_ALIGNMENT (16) 93 #else 94 # define BLADE_ARCHITECTURE BLADE_ARCHITECTURE_32BIT 95 # define BLADE_MEMORY_ALIGNMENT (8) 96 #endif 97 98 /************************************************************************/ 99 /* this is the compiler specific ,MSVC and GCC currently supported */ 100 /************************************************************************/ 101 #define BLADE_COMPILER_MSVC (0) 102 #define BLADE_COMPILER_GNUC (1) 103 104 105 #if defined(_MSC_VER) 106 # define BLADE_COMPILER BLADE_COMPILER_MSVC 107 # define BLADE_ALIGNED(n) __declspec(align(n)) 108 # define BLADE_CDECL __cdecl 109 # define BLADE_STDCALL __stdcall 110 # define BLADE_FASTCALL __fastcall 111 # define BLADE_FUNCTION __FUNCTION__ 112 # define BLADE_ALLWAYS_INLINE __forceinline 113 #elif defined(__GNUC__) 114 # define BLADE_COMPILER BLADE_COMPILER_GNUC 115 # define BLADE_ALIGNED(n) __attribute__((aligned(n))) 116 # define BLADE_CDECL __attribute__((cdecl)) 117 # define BLADE_STDCALL __attribute__((stdcall)) 118 # define BLADE_FASTCALL __attribute__((fastcall)) 119 # define BLADE_FUNCTION __PRETTY_FUNCTION__ 120 # define BLADE_ALLWAYS_INLINE __attribute__((always_inline)) 121 #else 122 # error "Compiler not supported yet." 123 # define BLADE_ALLWAYS_INLINE inline 124 #endif 125 126 #if defined(_DEBUG) || defined(DEBUG) 127 # define BLADE_DEBUG 1 128 #else 129 # define BLADE_DEBUG 0 130 #endif 131 132 #define BLADE_ENDIAN_LITTLE 0 133 #define BLADE_ENDIAN_BIG 1 134 135 //endian macros 136 //HOWTO: ARM processor can have dynamic endian with endian map, how to check? 137 138 #if BLADE_PROCESSOR == BLADE_PROCESSOR_X86 || 139 BLADE_PROCESSOR == BLADE_PROCESSOR_ARM 140 141 #define BLADE_ENDIAN BLADE_ENDIAN_LITTLE 142 143 #else 144 145 #define BLADE_ENDIAN BLADE_ENDIAN_BIG 146 147 #endif 148 149 //make unicode macro having a value 150 #if defined(UNICODE) || defined(_UNICODE) 151 # undef UNICODE 152 # define UNICODE 1 153 # define BLADE_UNICODE 1 154 #else 155 # define BLADE_UNICODE 0 156 #endif 157 158 159 #endif // __Blade_Platform_h__