• Cross Platform Note: STD C++ Preprocessor directives & pre-defined macros


    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__
  • 相关阅读:
    24节气冬至
    最佳人体舒适温度是多少?
    常用正则
    点击按钮后的Loading处理
    支付时过渡动画
    npm ci 和 npm install
    Vue批量上传文件及实时进度
    HTML DOM classList 属性的使用
    Electron Uncaught ReferenceError: require is not defined
    javascript 深拷贝的问题
  • 原文地址:https://www.cnblogs.com/crazii/p/4710190.html
Copyright © 2020-2023  润新知