Skip to content

Instantly share code, notes, and snippets.

@JJL772
Last active June 15, 2022 06:19
Show Gist options
  • Save JJL772/4c10ee2b35114a88393696f6a6f93054 to your computer and use it in GitHub Desktop.
Save JJL772/4c10ee2b35114a88393696f6a6f93054 to your computer and use it in GitHub Desktop.
Somewhat comprehensive list of feature test macros for C/C++. Leave a comment if I forgot anything
// Compile time info
#pragma once
//==========================================================//
// Feature test macros. Enjoy (or not)
//==========================================================//
// FORBID_XXX stuff is used to force disable various intrinsics
// See the OS_XXX section (near the bottom) to find which OS you're using
#if ( defined(__AVX__) ) && !( defined(FORBID_SIMD) || defined(FORBID_AVX) )
# undef USE_AVX
# define USE_AVX 1
#endif
#if ( defined(__AVX2__) ) && !( defined(FORBID_SIMD) || defined(FORBID_AVX2) )
# undef USE_AVX2
# define USE_AVX2 1
#endif
#if ( defined(__SSE__) || defined(_M_X64) || (_M_IX86_FP >= 1) ) && !( defined(FORBID_SIMD) || defined(FORBID_SSE) )
# undef USE_SSE
# define USE_SSE 1
#endif
#if ( defined(__SSE2__) || defined(_M_X64) || (_M_IX86_FP >= 2) ) && !( defined(FORBID_SIMD) || defined(FORBID_SSE2) )
# undef USE_SSE2
# define USE_SSE2 1
#endif
#if ( defined(__SSE3__) || defined(_M_X64) ) && !( defined(FORBID_SIMD) || defined(FORBID_SSE3) )
# undef USE_SSE3
# define USE_SSE3 1
#endif
#if ( defined(__SSE4_1__) ) && !( defined(FORBID_SIMD) || defined(FORBID_SSE41) )
# undef USE_SSE41
# define USE_SSE41 1
#endif
#if ( defined(__SSE4_2__) ) && !( defined(FORBID_SIMD) || defined(FORBID_SSE42) )
# undef USE_SSE42
# define USE_SSE42 1
#endif
#if ( defined(__SSSE3__) ) && !( defined(FORBID_SIMD) || defined(FORBID_SSSE3) )
# undef USE_SSSE3
# define USE_SSSE3 1
#endif
#if ( defined(__ARM_NEON) ) && !( defined(FORBID_SIMD) || defined(FORBID_NEON) )
# undef USE_NEON
# define USE_NEON 1
#endif
#if ( defined(__ARM_FEATURE_SVE) ) && !( defined(FORBID_SIMD) || defined(FORBID_SVE) )
# undef USE_SVE
# define USE_SVE 1
#endif
#if ( defined(__ARM_FEATURE_SVE2) ) && !( defined(FORBID_SIMD) || defined(FORBID_SVE2) )
# undef USE_SVE2
# define USE_SVE2 1
#endif
#if ( defined(__ARM_FEATURE_CRC32) )
# undef HAS_ARM_CRC32
# define HAS_ARM_CRC32 1
#endif
#if ( defined(__ARM_FEATURE_FMA) )
# undef HAS_ARM_FMA
# define HAS_ARM_FMA 1
#endif
#if ( defined(__ARM_FEATURE_COMPLEX) )
# undef HAS_ARM_COMPLEX
# define HAS_ARM_COMPLEX 1
#endif
#if ( defined(__ARM_FEATURE_SVE) )
# undef HAS_ARM_SVE
# define HAS_ARM_SVE 1
#endif
#if ( defined(__ARM_FEATURE_SVE2) )
# undef HAS_ARM_SVE2
# define HAS_ARM_SVE2 1
#endif
#if ( defined(__amd64__) || defined(_M_X64_) )
# undef PLATFORM_64BITS
# undef _X64_
# undef PLATFORM_AMD64
# define PLATFORM_64BITS 1
# define _X64_ 1
# define PLATFORM_AMD64 1
#endif
#if ( defined(__i386__) || defined(_M_IX86_) )
# undef PLATFORM_32BITS
# undef PLATFORM_X86
# undef _X86_
# define PLATFORM_32BITS 1
# define PLATFORM_X86 1
# define _X86_ 1
#endif
#if ( defined(_M_ARM) || defined(__arm__) )
# undef PLATFORM_32BITS
# undef PLATFORM_ARM
# undef PLATFORM_ARM32
# define PLATFORM_32BITS 1
# define PLATFORM_ARM 1
# define PLATFORM_ARM32 1
#endif
#if ( defined(_M_ARM64) || defined(__aarch64__) )
# undef PLATFORM_64BITS
# undef PLATFORM_ARM
# undef PLATFORM_ARM64
# define PLATFORM_64BITS 1
# define PLATFORM_ARM 1
# define PLATFORM_ARM64 1
#endif
#if ( defined(__ppc64__) )
# undef PLATFORM_64BITS
# undef PLATFORM_PPC
# undef PLATFORM_PPC64
# define PLATFORM_64BITS 1
# define PLATFORM_PPC 1
# define PLATFORM_PPC64 1
#elif ( defined(__ppc__) )
# undef PLATFORM_32BITS
# undef PLATFORM_PPC
# undef PLATFORM_PPC32
# define PLATFORM_32BITS 1
# define PLATFORM_PPC 1
# define PLATFORM_PPC32 1
#endif
#if ( defined(__riscv) )
# undef PLATFORM_64BITS
# undef PLATFORM_RISCV
# undef PLATFORM_RISCV64
# define PLATFORM_64BITS 1
# define PLATFORM_RISCV 1
# define PLATFORM_RISCV64 1
#endif
#if ( defined(__GNUC__) )
# undef COMPILER_GCC
# define COMPILER_GCC 1
#endif
#if ( defined(_MSC_VER) )
# undef COMPILER_MSVC
# define COMPILER_MSVC 1
#endif
#if ( defined(__clang__) )
# undef COMPILER_CLANG
# define COMPILER_CLANG 1
#endif
#if ( defined(__linux__) )
# undef OS_STRING
# define OS_STRING "Linux"
# undef OS_LINUX
# define OS_LINUX 1
# undef OS_POSIX
# define OS_POSIX 1
#endif
#if ( defined(_WIN32) || defined(__CYGWIN__) )
# undef OS_STRING
# define OS_STRING "Windows"
# undef OS_WINDOWS
# define OS_WINDOWS 1
#endif
#if ( defined(__APPLE__) )
# undef OS_STRING
# define OS_STRING "OSX"
# undef OS_OSX
# define OS_OSX 1
# undef OS_POSIX
# define OS_POSIX 1
#endif
#if ( defined(__ANDROID__) )
# undef OS_STRING
# define OS_STRING "Android"
# undef OS_ANDROID
# define OS_ANDROID
# undef OS_POSIX
# define OS_POSIX 1
#endif
// For mingw/cygwin, we're mostly posix compliant, barring some small problems. Indicate that core posix features are available, but not everything
#if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW__) || defined(__MINGW64__) || defined(OS_POSIX)
# undef OS_PARTIAL_POSIX
# define OS_PARTIAL_POSIX 1
#endif
#if defined(__MINGW__) || defined(__MINGW64__) || defined(__MINGW32__)
# undef COMPILER_MINGW 0
# define COMPILER_MINGW 1
#endif
#if defined(__CYGWIN__)
# undef COMPILER_CYGWIN 0
# define COMPILER_CYGWIN 1
#endif
// GCC/Clang only, afaik
#if ( __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ )
# undef PLATFORM_BIG_ENDIAN
# define PLATFORM_BIG_ENDIAN 1
#else
# undef PLATFORM_LITTLE_ENDIAN
# define PLATFORM_LITTLE_ENDIAN 1
#endif
#ifdef OS_WINDOWS
# undef DLL_EXT
# define DLL_EXT ".dll"
# undef LIB_EXT
# define LIB_EXT ".lib"
# undef EXE_EXT
# define EXE_EXT ".exe"
#elif OS_OSX
# undef DLL_EXT
# define DLL_EXT ".dylib"
# undef LIB_EXT
# define LIB_EXT ".a"
# undef EXE_EXT
# define EXE_EXT ""
#else
# undef DLL_EXT
# define DLL_EXT ".so"
# undef LIB_EXT
# define LIB_EXT ".a"
# undef EXE_EXT
# define EXE_EXT ""
#endif
#if (COMPILER_CLANG == 1) || (COMPILER_GCC == 1)
# ifdef OS_WINDOWS
# undef COMPILER_DLLEXPORT
# define COMPILER_DLLEXPORT __attribute__((dllexport))
# undef COMPILER_DLLIMPORT
# define COMPILER_DLLIMPORT __attribute__((dllimport))
# else
# undef COMPILER_DLLEXPORT
# define COMPILER_DLLEXPORT __attribute__((visibility("default")))
# undef COMPILER_DLLIMPORT
# define COMPILER_DLLIMPORT /* N/A :) */
# endif
#else
# undef COMPILER_DLLEXPORT
# define COMPILER_DLLEXPORT __declspec(dllexport)
# undef COMPILER_DLLIMPORT
# define COMPILER_DLLIMPORT __declspec(dllimport)
#endif
#ifdef OS_POSIX
#undef _POSIX
#define _POSIX 1
#endif
#ifdef OS_LINUX
#undef _LINUX
#define _LINUX 1
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment