• 区分不同操作系统、编译器不同版本的宏


    【1】不同操作系统的宏

    可以参考QtCore/qsystemdetection.h文件:

      1 /****************************************************************************
      2 **
      3 ** Copyright (C) 2016 The Qt Company Ltd.
      4 ** Contact: https://www.qt.io/licensing/
      5 **
      6 ** This file is part of the QtCore module of the Qt Toolkit.
      7 **
      8 ** $QT_BEGIN_LICENSE:LGPL$
      9 ** Commercial License Usage
     10 ** Licensees holding valid commercial Qt licenses may use this file in
     11 ** accordance with the commercial license agreement provided with the
     12 ** Software or, alternatively, in accordance with the terms contained in
     13 ** a written agreement between you and The Qt Company. For licensing terms
     14 ** and conditions see https://www.qt.io/terms-conditions. For further
     15 ** information use the contact form at https://www.qt.io/contact-us.
     16 **
     17 ** GNU Lesser General Public License Usage
     18 ** Alternatively, this file may be used under the terms of the GNU Lesser
     19 ** General Public License version 3 as published by the Free Software
     20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
     21 ** packaging of this file. Please review the following information to
     22 ** ensure the GNU Lesser General Public License version 3 requirements
     23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
     24 **
     25 ** GNU General Public License Usage
     26 ** Alternatively, this file may be used under the terms of the GNU
     27 ** General Public License version 2.0 or (at your option) the GNU General
     28 ** Public license version 3 or any later version approved by the KDE Free
     29 ** Qt Foundation. The licenses are as published by the Free Software
     30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
     31 ** included in the packaging of this file. Please review the following
     32 ** information to ensure the GNU General Public License requirements will
     33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
     34 ** https://www.gnu.org/licenses/gpl-3.0.html.
     35 **
     36 ** $QT_END_LICENSE$
     37 **
     38 ****************************************************************************/
     39 
     40 #ifndef QGLOBAL_H
     41 # include <QtCore/qglobal.h>
     42 #endif
     43 
     44 #ifndef QSYSTEMDETECTION_H
     45 #define QSYSTEMDETECTION_H
     46 
     47 /*
     48    The operating system, must be one of: (Q_OS_x)
     49 
     50      DARWIN   - Any Darwin system (macOS, iOS, watchOS, tvOS)
     51      MACOS    - macOS
     52      IOS      - iOS
     53      WATCHOS  - watchOS
     54      TVOS     - tvOS
     55      MSDOS    - MS-DOS and Windows
     56      OS2      - OS/2
     57      OS2EMX   - XFree86 on OS/2 (not PM)
     58      WIN32    - Win32 (Windows 2000/XP/Vista/7 and Windows Server 2003/2008)
     59      WINRT    - WinRT (Windows 8 Runtime)
     60      CYGWIN   - Cygwin
     61      SOLARIS  - Sun Solaris
     62      HPUX     - HP-UX
     63      ULTRIX   - DEC Ultrix
     64      LINUX    - Linux [has variants]
     65      FREEBSD  - FreeBSD [has variants]
     66      NETBSD   - NetBSD
     67      OPENBSD  - OpenBSD
     68      BSDI     - BSD/OS
     69      INTERIX  - Interix
     70      IRIX     - SGI Irix
     71      OSF      - HP Tru64 UNIX
     72      SCO      - SCO OpenServer 5
     73      UNIXWARE - UnixWare 7, Open UNIX 8
     74      AIX      - AIX
     75      HURD     - GNU Hurd
     76      DGUX     - DG/UX
     77      RELIANT  - Reliant UNIX
     78      DYNIX    - DYNIX/ptx
     79      QNX      - QNX [has variants]
     80      QNX6     - QNX RTP 6.1
     81      LYNX     - LynxOS
     82      BSD4     - Any BSD 4.4 system
     83      UNIX     - Any UNIX BSD/SYSV system
     84      ANDROID  - Android platform
     85      HAIKU    - Haiku
     86 
     87    The following operating systems have variants:
     88      LINUX    - both Q_OS_LINUX and Q_OS_ANDROID are defined when building for Android
     89               - only Q_OS_LINUX is defined if building for other Linux systems
     90      FREEBSD  - Q_OS_FREEBSD is defined only when building for FreeBSD with a BSD userland
     91               - Q_OS_FREEBSD_KERNEL is always defined on FreeBSD, even if the userland is from GNU
     92 */
     93 
     94 #if defined(__APPLE__) && (defined(__GNUC__) || defined(__xlC__) || defined(__xlc__))
     95 #  include <TargetConditionals.h>
     96 #  if defined(TARGET_OS_MAC) && TARGET_OS_MAC
     97 #    define Q_OS_DARWIN
     98 #    define Q_OS_BSD4
     99 #    ifdef __LP64__
    100 #      define Q_OS_DARWIN64
    101 #    else
    102 #      define Q_OS_DARWIN32
    103 #    endif
    104 #    if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
    105 #      define QT_PLATFORM_UIKIT
    106 #      if defined(TARGET_OS_WATCH) && TARGET_OS_WATCH
    107 #        define Q_OS_WATCHOS
    108 #      elif defined(TARGET_OS_TV) && TARGET_OS_TV
    109 #        define Q_OS_TVOS
    110 #      else
    111 #        // TARGET_OS_IOS is only available in newer SDKs,
    112 #        // so assume any other iOS-based platform is iOS for now
    113 #        define Q_OS_IOS
    114 #      endif
    115 #    else
    116 #      // TARGET_OS_OSX is only available in newer SDKs,
    117 #      // so assume any non iOS-based platform is macOS for now
    118 #      define Q_OS_MACOS
    119 #    endif
    120 #  else
    121 #    error "Qt has not been ported to this Apple platform - see http://www.qt.io/developers"
    122 #  endif
    123 #elif defined(__ANDROID__) || defined(ANDROID)
    124 #  define Q_OS_ANDROID
    125 #  define Q_OS_LINUX
    126 #elif defined(__CYGWIN__)
    127 #  define Q_OS_CYGWIN
    128 #elif !defined(SAG_COM) && (!defined(WINAPI_FAMILY) || WINAPI_FAMILY==WINAPI_FAMILY_DESKTOP_APP) && (defined(WIN64) || defined(_WIN64) || defined(__WIN64__))
    129 #  define Q_OS_WIN32
    130 #  define Q_OS_WIN64
    131 #elif !defined(SAG_COM) && (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__))
    132 #  if defined(WINAPI_FAMILY)
    133 #    ifndef WINAPI_FAMILY_PC_APP
    134 #      define WINAPI_FAMILY_PC_APP WINAPI_FAMILY_APP
    135 #    endif
    136 #    if defined(WINAPI_FAMILY_PHONE_APP) && WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP
    137 #      define Q_OS_WINRT
    138 #    elif WINAPI_FAMILY==WINAPI_FAMILY_PC_APP
    139 #      define Q_OS_WINRT
    140 #    else
    141 #      define Q_OS_WIN32
    142 #    endif
    143 #  else
    144 #    define Q_OS_WIN32
    145 #  endif
    146 #elif defined(__sun) || defined(sun)
    147 #  define Q_OS_SOLARIS
    148 #elif defined(hpux) || defined(__hpux)
    149 #  define Q_OS_HPUX
    150 #elif defined(__ultrix) || defined(ultrix)
    151 #  define Q_OS_ULTRIX
    152 #elif defined(sinix)
    153 #  define Q_OS_RELIANT
    154 #elif defined(__native_client__)
    155 #  define Q_OS_NACL
    156 #elif defined(__linux__) || defined(__linux)
    157 #  define Q_OS_LINUX
    158 #elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)
    159 #  ifndef __FreeBSD_kernel__
    160 #    define Q_OS_FREEBSD
    161 #  endif
    162 #  define Q_OS_FREEBSD_KERNEL
    163 #  define Q_OS_BSD4
    164 #elif defined(__NetBSD__)
    165 #  define Q_OS_NETBSD
    166 #  define Q_OS_BSD4
    167 #elif defined(__OpenBSD__)
    168 #  define Q_OS_OPENBSD
    169 #  define Q_OS_BSD4
    170 #elif defined(__bsdi__)
    171 #  define Q_OS_BSDI
    172 #  define Q_OS_BSD4
    173 #elif defined(__INTERIX)
    174 #  define Q_OS_INTERIX
    175 #  define Q_OS_BSD4
    176 #elif defined(__sgi)
    177 #  define Q_OS_IRIX
    178 #elif defined(__osf__)
    179 #  define Q_OS_OSF
    180 #elif defined(_AIX)
    181 #  define Q_OS_AIX
    182 #elif defined(__Lynx__)
    183 #  define Q_OS_LYNX
    184 #elif defined(__GNU__)
    185 #  define Q_OS_HURD
    186 #elif defined(__DGUX__)
    187 #  define Q_OS_DGUX
    188 #elif defined(__QNXNTO__)
    189 #  define Q_OS_QNX
    190 #elif defined(_SEQUENT_)
    191 #  define Q_OS_DYNIX
    192 #elif defined(_SCO_DS) /* SCO OpenServer 5 + GCC */
    193 #  define Q_OS_SCO
    194 #elif defined(__USLC__) /* all SCO platforms + UDK or OUDK */
    195 #  define Q_OS_UNIXWARE
    196 #elif defined(__svr4__) && defined(i386) /* Open UNIX 8 + GCC */
    197 #  define Q_OS_UNIXWARE
    198 #elif defined(__INTEGRITY)
    199 #  define Q_OS_INTEGRITY
    200 #elif defined(VXWORKS) /* there is no "real" VxWorks define - this has to be set in the mkspec! */
    201 #  define Q_OS_VXWORKS
    202 #elif defined(__HAIKU__)
    203 #  define Q_OS_HAIKU
    204 #elif defined(__MAKEDEPEND__)
    205 #else
    206 #  error "Qt has not been ported to this OS - see http://www.qt-project.org/"
    207 #endif
    208 
    209 #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) || defined(Q_OS_WINRT)
    210 #  define Q_OS_WIN
    211 #endif
    212 
    213 #if defined(Q_OS_WIN)
    214 #  undef Q_OS_UNIX
    215 #elif !defined(Q_OS_UNIX)
    216 #  define Q_OS_UNIX
    217 #endif
    218 
    219 // Compatibility synonyms
    220 #ifdef Q_OS_DARWIN
    221 #define Q_OS_MAC
    222 #endif
    223 #ifdef Q_OS_DARWIN32
    224 #define Q_OS_MAC32
    225 #endif
    226 #ifdef Q_OS_DARWIN64
    227 #define Q_OS_MAC64
    228 #endif
    229 #ifdef Q_OS_MACOS
    230 #define Q_OS_MACX
    231 #define Q_OS_OSX
    232 #endif
    233 
    234 #ifdef Q_OS_DARWIN
    235 #  include <Availability.h>
    236 #  include <AvailabilityMacros.h>
    237 #
    238 #  ifdef Q_OS_MACOS
    239 #    if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_6
    240 #       undef __MAC_OS_X_VERSION_MIN_REQUIRED
    241 #       define __MAC_OS_X_VERSION_MIN_REQUIRED __MAC_10_6
    242 #    endif
    243 #    if !defined(MAC_OS_X_VERSION_MIN_REQUIRED) || MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6
    244 #       undef MAC_OS_X_VERSION_MIN_REQUIRED
    245 #       define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_6
    246 #    endif
    247 #  endif
    248 #
    249 #  // Numerical checks are preferred to named checks, but to be safe
    250 #  // we define the missing version names in case Qt uses them.
    251 #
    252 #  if !defined(__MAC_10_7)
    253 #       define __MAC_10_7 1070
    254 #  endif
    255 #  if !defined(__MAC_10_8)
    256 #       define __MAC_10_8 1080
    257 #  endif
    258 #  if !defined(__MAC_10_9)
    259 #       define __MAC_10_9 1090
    260 #  endif
    261 #  if !defined(__MAC_10_10)
    262 #       define __MAC_10_10 101000
    263 #  endif
    264 #  if !defined(__MAC_10_11)
    265 #       define __MAC_10_11 101100
    266 #  endif
    267 #  if !defined(__MAC_10_12)
    268 #       define __MAC_10_12 101200
    269 #  endif
    270 #  if !defined(__MAC_10_13)
    271 #       define __MAC_10_13 101300
    272 #  endif
    273 #  if !defined(MAC_OS_X_VERSION_10_7)
    274 #       define MAC_OS_X_VERSION_10_7 1070
    275 #  endif
    276 #  if !defined(MAC_OS_X_VERSION_10_8)
    277 #       define MAC_OS_X_VERSION_10_8 1080
    278 #  endif
    279 #  if !defined(MAC_OS_X_VERSION_10_9)
    280 #       define MAC_OS_X_VERSION_10_9 1090
    281 #  endif
    282 #  if !defined(MAC_OS_X_VERSION_10_10)
    283 #       define MAC_OS_X_VERSION_10_10 101000
    284 #  endif
    285 #  if !defined(MAC_OS_X_VERSION_10_11)
    286 #       define MAC_OS_X_VERSION_10_11 101100
    287 #  endif
    288 #  if !defined(MAC_OS_X_VERSION_10_12)
    289 #       define MAC_OS_X_VERSION_10_12 101200
    290 #  endif
    291 #  if !defined(MAC_OS_X_VERSION_10_13)
    292 #       define MAC_OS_X_VERSION_10_13 101300
    293 #  endif
    294 #
    295 #  if !defined(__IPHONE_4_3)
    296 #       define __IPHONE_4_3 40300
    297 #  endif
    298 #  if !defined(__IPHONE_5_0)
    299 #       define __IPHONE_5_0 50000
    300 #  endif
    301 #  if !defined(__IPHONE_5_1)
    302 #       define __IPHONE_5_1 50100
    303 #  endif
    304 #  if !defined(__IPHONE_6_0)
    305 #       define __IPHONE_6_0 60000
    306 #  endif
    307 #  if !defined(__IPHONE_6_1)
    308 #       define __IPHONE_6_1 60100
    309 #  endif
    310 #  if !defined(__IPHONE_7_0)
    311 #       define __IPHONE_7_0 70000
    312 #  endif
    313 #  if !defined(__IPHONE_7_1)
    314 #       define __IPHONE_7_1 70100
    315 #  endif
    316 #  if !defined(__IPHONE_8_0)
    317 #       define __IPHONE_8_0 80000
    318 #  endif
    319 #  if !defined(__IPHONE_8_1)
    320 #       define __IPHONE_8_1 80100
    321 #  endif
    322 #  if !defined(__IPHONE_8_2)
    323 #       define __IPHONE_8_2 80200
    324 #  endif
    325 #  if !defined(__IPHONE_8_3)
    326 #       define __IPHONE_8_3 80300
    327 #  endif
    328 #  if !defined(__IPHONE_8_4)
    329 #       define __IPHONE_8_4 80400
    330 #  endif
    331 #  if !defined(__IPHONE_9_0)
    332 #       define __IPHONE_9_0 90000
    333 #  endif
    334 #  if !defined(__IPHONE_9_1)
    335 #       define __IPHONE_9_1 90100
    336 #  endif
    337 #  if !defined(__IPHONE_9_2)
    338 #       define __IPHONE_9_2 90200
    339 #  endif
    340 #  if !defined(__IPHONE_9_3)
    341 #       define __IPHONE_9_3 90300
    342 #  endif
    343 #  if !defined(__IPHONE_10_0)
    344 #       define __IPHONE_10_0 100000
    345 #  endif
    346 #  if !defined(__IPHONE_10_1)
    347 #       define __IPHONE_10_1 100100
    348 #  endif
    349 #  if !defined(__IPHONE_10_2)
    350 #       define __IPHONE_10_2 100200
    351 #  endif
    352 #  if !defined(__IPHONE_10_3)
    353 #       define __IPHONE_10_3 100300
    354 #  endif
    355 #  if !defined(__IPHONE_11_0)
    356 #       define __IPHONE_11_0 110000
    357 #  endif
    358 #endif
    359 
    360 #ifdef __LSB_VERSION__
    361 #  if __LSB_VERSION__ < 40
    362 #    error "This version of the Linux Standard Base is unsupported"
    363 #  endif
    364 #ifndef QT_LINUXBASE
    365 #  define QT_LINUXBASE
    366 #endif
    367 #endif
    368 
    369 #endif // QSYSTEMDETECTION_H

    各种操作系统的宏定义。

    【2】不同编译器不同版本的宏

    (1)不同编译器

    1.1 Visual C++ 编译器预定义宏:C/C++ Predefined Macros

    1.2 GCC 编译器预定义宏:GNU Common Predefined Macros

    (2)不同版本

    2.1 Visual C++ 编译器 _MSC_VER

    _MSC_VER 即时Microsoft C/C++ 编译器版本预定义宏。

    一些编译器版本的_MSC_VER值:

     1 MS VC++ 14.0 _MSC_VER = 1900 (Visual Studio 2015)
     2 MS VC++ 12.0 _MSC_VER = 1800 (VisualStudio 2013)
     3 MS VC++ 11.0 _MSC_VER = 1700 (VisualStudio 2012)
     4 MS VC++ 10.0 _MSC_VER = 1600(VisualStudio 2010)
     5 MS VC++ 9.0 _MSC_VER = 1500(VisualStudio 2008)
     6 MS VC++ 8.0 _MSC_VER = 1400(VisualStudio 2005)
     7 MS VC++ 7.1 _MSC_VER = 1310(VisualStudio 2003)
     8 MS VC++ 7.0 _MSC_VER = 1300(VisualStudio .NET)
     9 MS VC++ 6.0 _MSC_VER = 1200(VisualStudio 98)
    10 MS VC++ 5.0 _MSC_VER = 1100(VisualStudio 97)
    11 其中MS VC++ 14.0表示Visual C++的版本为14.0,后面括号中的Visual Studio 2015,表明该VC++包含在微软开发工具Visual Studio 2015中。

    其应用示例如下:

     1 #if _MSC_VER >= 1400 // for vc8, or vc9
     2 #ifdef _DEBUG
     3 #pragma comment( lib, "SomeLib-vc8-d.lib" )
     4 #elif
     5 #pragma comment( lib, "SomeLib-vc8-r.lib" )
     6 #endif
     7 #elif _MSC_VER >= 1310 // for vc71
     8 #ifdef _DEBUG
     9 #pragma comment( lib, "SomeLib-vc71-d.lib" )
    10 #elif
    11 #pragma comment( lib, "SomeLib-vc71-r.lib" )
    12 #endif
    13 #elif _MSC_VER >=1200 // for vc6
    14 #ifdef _DEBUG
    15 #pragma comment( lib, "SomeLib-vc6-d.lib" )
    16 #elif
    17 #pragma comment( lib, "SomeLib-vc6-r.lib" )
    18 #endif
    19 #endif

    如上所述。

    2.2 GCC编译器 _GNUC_

    __GNUC__ 、__GNUC_MINOR__ 、__GNUC_PATCHLEVEL__分别代表gcc的主版本号,次版本号,修正版本号。

    应用示例:比如我们的代码要求gcc的版本至少在3.2.0以上,我们就可以写成如下方式的条件编译:

    1 /* Test for GCC > 3.2.0 */
    2 #if __GNUC__ > 3 || 
    3   (__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || 
    4     (__GNUC_MINOR__ == 2 && 
    5       __GNUC_PATCHLEVEL__ > 0)))
    6   printf("gcc > 3.2.0
    ");
    7   //...
    8 #endif

    Good Good Study, Day Day Up.

    顺序 选择 循环 总结 

  • 相关阅读:
    大三寒假生活19
    大三寒假生活18
    大三寒假生活17
    大三寒假生活16
    大三寒假生活15
    大三寒假生活14
    MySQL 字符集与比较规则
    Python ord & chr
    CentOS7 通过 devstack 安装 OpenStack
    Python *args & **kwargs
  • 原文地址:https://www.cnblogs.com/Braveliu/p/10129819.html
Copyright © 2020-2023  润新知