zoukankan      html  css  js  c++  java
  • 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__
  • 相关阅读:
    spring mvc给参数起别名
    聊聊分布式定时任务中间件架构及其实现--转
    Batch Normalization的算法本质是在网络每一层的输入前增加一层BN层(也即归一化层),对数据进行归一化处理,然后再进入网络下一层,但是BN并不是简单的对数据进行求归一化,而是引入了两个参数λ和β去进行数据重构
    终端安全工具 gartner 排名
    When Cyber Security Meets Machine Learning 机器学习 安全分析 对于安全领域的总结很有用 看未来演进方向
    DNS隧道之DNS2TCP实现——dns2tcpc必须带server IP才可以,此外ssh可以穿过墙的,设置代理上网
    DNS隧道之DNS2TCP使用心得教程——是可以用来穿透qiang的,ubuntu下直接apt install dns2tcp
    DNS隧道工具汇总——补充,还有IP over DNS的工具NSTX、Iodine、DNSCat
    Data Mining and Machine Learning in Cybersecurity PDF
    ES failed to notify ClusterStateListener java.lang.IllegalStateException: environment is not locked
  • 原文地址:https://www.cnblogs.com/crazii/p/4710190.html
Copyright © 2011-2022 走看看