Search code examples
c++gcc

Detect gcc as opposed to msvc / clang with macro


I am working on a project that has been built with both gcc and msvc so far. We recently started building with clang as well.

There are some parts in the code, where platform-specific things are done:

#ifndef _WIN32
// ignore this in msvc
#endif

Since gcc has previously been the only non-windows build, this was equivalent to saying "do this only for gcc". But now it means "do this only for gcc and clang".

However there are still situations, where I would like to handle something specifically for gcc, and not for clang. Is there a simple and robust way to detect gcc, i.e.

#ifdef ???
// do this *only* for gcc
#endif

Solution

  • __GNUC__
    __GNUC_MINOR__
    __GNUC_PATCHLEVEL__
    

    These macros are defined by all GNU compilers that use the C preprocessor: C, C++, Objective-C and Fortran. Their values are the major version, minor version, and patch level of the compiler, as integer constants. For example, GCC 3.2.1 will define __GNUC__ to 3, __GNUC_MINOR__ to 2, and __GNUC_PATCHLEVEL__ to 1. These macros are also defined if you invoke the preprocessor directly.

    Also:

    __GNUG__
    

    The GNU C++ compiler defines this. Testing it is equivalent to testing (__GNUC__ && __cplusplus).

    Source

    Apparently, clang uses them too. However it also defines:

    __clang__
    __clang_major__
    __clang_minor__
    __clang_patchlevel__
    

    So you can do:

    #ifdef __GNUC__
        #ifndef __clang__
    ...
    

    Or even better (note the order):

    #if defined(__clang__)
    ....
    #elif defined(__GNUC__) || defined(__GNUG__)
    ....
    #elif defined(_MSC_VER)
    ....