Skip to content

Instantly share code, notes, and snippets.

@yjfvictor
Last active November 16, 2021 03:47
Show Gist options
  • Save yjfvictor/4952b9ea7cc7b7f044b3 to your computer and use it in GitHub Desktop.
Save yjfvictor/4952b9ea7cc7b7f044b3 to your computer and use it in GitHub Desktop.
C/C++ Compiler Version Check
/*
* This is free and unencumbered software released into the public domain.
*
* Anyone is free to copy, modify, publish, use, compile, sell, or
* distribute this software, either in source code form or as a compiled
* binary, for any purpose, commercial or non-commercial, and by any
* means.
*
* In jurisdictions that recognize copyright laws, the author or authors
* of this software dedicate any and all copyright interest in the
* software to the public domain. We make this dedication for the benefit
* of the public at large and to the detriment of our heirs and
* successors. We intend this dedication to be an overt act of
* relinquishment in perpetuity of all present and future rights to this
* software under copyright law.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* For more information, please refer to <http://unlicense.org/>
*/
#define _STR(x) #x
#define STR(x) _STR(x)
#if defined __clang__
#if __clang_major__ == 1 // [
#error "Clang 1.x"
#elif __clang_major__ == 2
#error "Clang 2.x"
#elif __clang_major__ >= 3
#pragma message ("Clang " STR(__clang_major__) "." STR(__clang_minor__) "." STR(__clang_patchlevel__))
#error
#else
#error "Clang unknown version"
#endif // __clang_major__ ]
#elif defined _MSC_VER
#if _MSC_VER == 800 //[
#error "Microsoft Visual C++ 1.0"
#elif _MSC_VER == 900
#error "Microsoft Visual C++ 3.0"
#elif _MSC_VER == 1000
#error "Microsoft Visual C++ 4.0"
#elif _MSC_VER == 1020
#error "Microsoft Visual C++ 4.2"
#elif _MSC_VER == 1100
#error "Microsoft Visual C++ 5.0"
#elif _MSC_VER == 1200
#error "Microsoft Visual C++ 6.0"
#elif _MSC_VER == 1300
#error "Microsoft Visual C++ 7.0 (Microsoft Visual Studio 2002)"
#elif _MSC_VER == 1310
#error "Microsoft Visual C++ 7.1 (Microsoft Visual Studio 2003)"
#elif _MSC_VER == 1400
#error "Microsoft Visual C++ 8.0 (Microsoft Visual Studio 2005)"
#elif _MSC_VER == 1500
#ifdef _MSC_FULL_VER == 150021022
#error "Microsoft Visual C++ 9.0 (Microsoft Visual Studio 2008)"
#elif _MSC_FULL_VER == 150030729
#error "Microsoft Visual C++ 9.0 SP 1 (Microsoft Visual Studio 2008 SP 1)"
#else
#error "Microsoft Visual C++ 9.0 SP ? (Microsoft Visual Studio 2008 SP ?)"
#endif
#elif _MSC_VER == 1600
#if _MSC_FULL_VER == 160030319
#error "Microsoft Visual C++ 10.0 (Microsoft Visual Studio 2010)"
#elif _MSC_FULL_VER == 160040219
#error "Microsoft Visual C++ 10.0 SP 1(Microsoft Visual Studio 2010 SP 1)"
#else
#error "Microsoft Visual C++ 10.0 SP ? (Microsoft Visual Studio 2010 SP ?)"
#endif
#elif _MSC_VER == 1700
#error "Microsoft Visual C++ 11.0 (Microsoft Visual Studio 2012)"
#elif _MSC_VER == 1800
#error "Microsoft Visual C++ 12.0 (Microsoft Visual Studio 2013)"
#elif _MSC_VER == 1900
#if _MSC_FULL_VER == 190023026
#error "Microsoft Visual C++ 14.0 (Microsoft Visual Studio 2015)"
#elif _MSC_FULL_VER == 190023506
#error "Microsoft Visual C++ 14.0 (Microsoft Visual Studio 2015 Update 1)"
#elif _MSC_FULL_VER == 190023918
#error "Microsoft Visual C++ 14.0 (Microsoft Visual Studio 2015 Update 2)"
#elif _MSC_FULL_VER == 190024210
#error "Microsoft Visual C++ 14.0 (Microsoft Visual Studio 2015 Update 3)"
#else
#error "Microsoft Visual C++ 14.0 (Microsoft Visual Studio 2015 Update ?)"
#endif
#elif _MSC_VER == 1910
#error "Microsoft Visual C++ 15.0 (Microsoft Visual Studio 2017)"
#else
#error "Microsoft Visual C++ unknown version"
#endif // _MSC_VER ]
#elif defined __GNUC__
#if __GNUC__ == 1 // [
#if __GNUC_MINOR__ == 0 // [
#error "GCC 1.0"
#elif __GNUC_MINOR__ == 1
#error "GCC 1.1"
#elif __GNUC_MINOR__ == 2
#error "GCC 1.2"
#elif __GNUC_MINOR__ == 3
#error "GCC 1.3"
#elif __GNUC_MINOR__ == 4
#error "GCC 1.4"
#elif __GNUC_MINOR__ == 5
#error "GCC 1.5"
#elif __GNUC_MINOR__ == 6
#error "GCC 1.6"
#elif __GNUC_MINOR__ == 7
#error "GCC 1.7"
#elif __GNUC_MINOR__ == 8
#error "GCC 1.8"
#elif __GNUC_MINOR__ == 9
#error "GCC 1.9"
#elif __GNUC_MINOR__ == 10
#error "GCC 1.10"
#elif __GNUC_MINOR__ == 11
#error "GCC 1.11"
#elif __GNUC_MINOR__ == 12
#error "GCC 1.12"
#else
#error "GCC 1.x"
#endif // __GNUC_MINOR__ ]
#elif __GNUC__ == 2
#if __GNUC_MINOR__ == 0 // [
#error "GCC 2.0"
#elif __GNUC_MINOR__ == 1
#error "GCC 2.1"
#elif __GNUC_MINOR__ == 2
#error "GCC 2.2"
#elif __GNUC_MINOR__ == 3
#error "GCC 2.3"
#elif __GNUC_MINOR__ == 4
#error "GCC 2.4"
#elif __GNUC_MINOR__ == 5
#error "GCC 2.5"
#elif __GNUC_MINOR__ == 6
#error "GCC 2.6"
#elif __GNUC_MINOR__ == 7
#error "GCC 2.7"
#elif __GNUC_MINOR__ == 8
#error "GCC 2.8"
#elif __GNUC_MINOR__ == 9
#error "GCC 2.9"
#elif __GNUC_MINOR__ == 10
#error "GCC 2.10"
#elif __GNUC_MINOR__ == 11
#error "GCC 2.11"
#elif __GNUC_MINOR__ == 12
#error "GCC 2.12"
#else
#error "GCC 2.x"
#endif // __GNUC_MINOR__ ]
#elif __GNUC__ == 3
#if __GNUC_MINOR__ == 0 // [
#error "GCC 3.0"
#elif __GNUC_MINOR__ == 1
#error "GCC 3.1"
#elif __GNUC_MINOR__ == 2
#error "GCC 3.2"
#elif __GNUC_MINOR__ == 3
#error "GCC 3.3"
#elif __GNUC_MINOR__ == 4
#error "GCC 3.4"
#elif __GNUC_MINOR__ == 5
#error "GCC 3.5"
#elif __GNUC_MINOR__ == 6
#error "GCC 3.6"
#elif __GNUC_MINOR__ == 7
#error "GCC 3.7"
#elif __GNUC_MINOR__ == 8
#error "GCC 3.8"
#elif __GNUC_MINOR__ == 9
#error "GCC 3.9"
#elif __GNUC_MINOR__ == 10
#error "GCC 3.10"
#elif __GNUC_MINOR__ == 11
#error "GCC 3.11"
#elif __GNUC_MINOR__ == 12
#error "GCC 3.12"
#else
#error "GCC 3.x"
#endif // __GNUC_MINOR__ ]
#elif __GNUC__ == 4
#if __GNUC_MINOR__ == 0 // [
#error "GCC 4.0"
#elif __GNUC_MINOR__ == 1
#error "GCC 4.1"
#elif __GNUC_MINOR__ == 2
#error "GCC 4.2"
#elif __GNUC_MINOR__ == 3
#error "GCC 4.3"
#elif __GNUC_MINOR__ == 4
#error "GCC 4.4"
#elif __GNUC_MINOR__ >= 5
#pragma message ("GCC " STR(__GNUC__) "." STR(__GNUC_MINOR__) "." STR(__GNUC_PATCHLEVEL__))
#error
#else
#error "GCC 3.x"
#endif // __GNUC_MINOR__ ]
#elif __GNUC__ >= 5
#pragma message ("GCC " STR(__GNUC__) "." STR(__GNUC_MINOR__) "." STR(__GNUC_PATCHLEVEL__))
#error
#else
#error "GCC unknown version"
#endif // __GNUC__ ]
#else
#error "Other Compiler"
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment