Lely core libraries 1.9.2
features.h
Go to the documentation of this file.
1
22#ifndef LELY_FEATURES_H_
23#define LELY_FEATURES_H_
24
25#if defined(__STDC_VERSION__) && __STDC_VERSION__ < 199901L
26#error This file requires compiler and library support for the ISO C99 standard.
27#endif
28
29#if defined(__cplusplus) && __cplusplus < 201103L
30#error This file requires compiler and library support for the ISO C++11 standard.
31#endif
32
33#ifdef _MSC_VER
34#if _MSC_VER < 1900
35#error This file requires Microsoft Visual C++ 2015 or later.
36#endif
37// Disable warnings about deprecated POSIX functions.
38#pragma warning(disable : 4996)
39#endif
40
41#ifdef _WIN32
42// Windows 7 is the minimum supported version.
43#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_WIN7)
44#undef NTDDI_VERSION
45#define NTDDI_VERSION NTDDI_WIN7
46#endif
47#if !defined(_WIN32_WINNT) || _WIN32_WINNT < _WIN32_WINNT_WIN7
48#undef _WIN32_WINNT
49#define _WIN32_WINNT _WIN32_WINNT_WIN7
50#endif
51#if !defined(WINVER) || WINVER < _WIN32_WINNT
52#undef WINVER
53#define WINVER _WIN32_WINNT
54#endif
55#ifndef WIN32_LEAN_AND_MEAN
56#define WIN32_LEAN_AND_MEAN
57#endif
58#include <windef.h>
59#endif
60
61// <limits.h> is guaranteed to be present, even in freestanding environments,
62// and will typically include <features.h>, which we need but cannot portably
63// include directly.
64#include <limits.h>
65
66// Include a (platform-specific) header which defines the POSIX feature test
67// macros.
68#ifdef __GLIBC__
69#include <bits/posix_opt.h>
70#elif defined(__NEWLIB__)
71#include <sys/features.h>
72#endif
73
74#ifndef CLANG_PREREQ
75#if defined(__clang__) && defined(__clang_major__) && defined(__clang_minor__)
76#define CLANG_PREREQ(major, minor) \
77 ((__clang_major__ << 16) + __clang_minor__ >= ((major) << 16) + (minor))
78#else
79#define CLANG_PREREQ(major, minor) 0
80#endif
81#endif
82
83#ifndef GNUC_PREREQ
84#if defined(__GNUC__) && defined(__GNUC_MINOR__)
85#define GNUC_PREREQ(major, minor) \
86 ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((major) << 16) + (minor))
87#else
88#define GNUC_PREREQ(major, minor) 0
89#endif
90#endif
91
92#ifndef __has_attribute
93#define __has_attribute(x) 0
94#endif
95
96#ifndef __has_builtin
97#define __has_builtin(x) 0
98#endif
99
100#ifndef __has_declspec_attribute
101#define __has_declspec_attribute(x) 0
102#endif
103
104#ifndef __has_extension
105#define __has_extension __has_feature
106#endif
107
108#ifndef __has_feature
109#define __has_feature(x) 0
110#endif
111
112#ifndef __has_include
113#define __has_include(x) 1
114#endif
115
116#ifndef __STDC_CONSTANT_MACROS
117#define __STDC_CONSTANT_MACROS 1
118#endif
119
120#ifndef __STDC_LIMIT_MACROS
121#define __STDC_LIMIT_MACROS 1
122#endif
123
124#ifndef __STDC_NO_ATOMICS__
125// GCC versions older than 4.9 do not properly advertise the absence of
126// <stdatomic.h>.
127// clang-format off
128#if defined(__cplusplus) || defined(_MSC_VER) \
129 || (defined(__GNUC__) && !GNUC_PREREQ(4, 9) \
130 && !defined(__clang__)) \
131 || (defined(__clang__) && !__has_extension(c_atomic))
132// clang-format on
133#define __STDC_NO_ATOMICS__ 1
134#endif
135#endif
136
137#ifndef __STDC_NO_THREADS__
138// Although recent versions of Cygwin do provide <threads.h>, it requires
139// <machine/_threads.h>, which is missing.
140#if defined(__cplusplus) || defined(_MSC_VER) || defined(__CYGWIN__)
141#define __STDC_NO_THREADS__ 1
142#endif
143#endif
144
145#ifndef __STDC_NO_VLA__
146#if defined(__cplusplus) || defined(_MSC_VER)
147#define __STDC_NO_VLA__ 1
148#endif
149#endif
150
151#ifdef __cplusplus
152
153#ifndef __cpp_exceptions
154#if (defined(_MSC_VER) && _HAS_EXCEPTIONS) \
155 || (defined(__GNUC__) && defined(__EXCEPTIONS)) \
156 || (defined(__clang__) && __has_feature(cxx_exceptions))
157#define __cpp_exceptions __cplusplus
158#endif
159#endif
160
161#ifndef __cpp_rtti
162#if (defined(_MSC_VER) && _CPPRTTI) \
163 || (defined(__GNUC__) && defined(__GXX_RTTI)) \
164 || (defined(__clang__) && __has_feature(cxx_rtti))
165#define __cpp_rtti __cplusplus
166#endif
167#endif
168
169#endif // __cplusplus
170
172// clang-format off
173#if !defined(_Alignas) && !(__STDC_VERSION__ >= 201112L \
174 && (GNUC_PREREQ(4, 7) || __has_feature(c_alignas)))
175// clang-format on
176#if __cplusplus >= 201103L && (GNUC_PREREQ(4, 8) || __has_feature(cxx_alignas))
177#define _Alignas alignas
178#elif defined(__GNUC__) || __has_attribute(__aligned__)
179#define _Alignas(x) __attribute__((__aligned__(x)))
180#elif defined(_MSC_VER) || defined(__declspec) \
181 || __has_declspec_attribute(align)
182#define _Alignas(x) __declspec(align(x))
183#else
184#define _Alignas(x)
185#endif
186#endif
187
189// clang-format off
190#if !defined(_Alignof) && !(__STDC_VERSION__ >= 201112L \
191 && (GNUC_PREREQ(4, 7) || __has_feature(c_alignof)))
192// clang-format on
193#if __cplusplus >= 201103L && (GNUC_PREREQ(4, 8) || __has_feature(cxx_alignof))
194#define _Alignof alignof
195#elif defined(__GNUC__)
196#define _Alignof(x) __alignof__(x)
197#elif defined(_MSC_VER)
198#define _Alignof(x) __alignof(x)
199#else
200#include <stddef.h>
201#define _Alignof(type)(offsetof(struct { char c; type x; }, x))
202#endif
203#endif
204
209// clang-format off
210#if !defined(_Noreturn) && !(__STDC_VERSION__ >= 201112L \
211 && (GNUC_PREREQ(4, 7) || CLANG_PREREQ(3, 3)))
212// clang-format on
213#if defined(__GNUC__) || __has_attribute(__noreturn__)
214#define _Noreturn __attribute__((__noreturn__))
215#elif defined(_MSC_VER) || defined(__declspec) \
216 || __has_declspec_attribute(noreturn)
217#define _Noreturn __declspec(noreturn)
218#else
219#define _Noreturn
220#endif
221#endif
222
231// clang-format off
232#if !defined(_Thread_local) && !(__STDC_VERSION__ >= 201112L \
233 && (GNUC_PREREQ(4, 7) || __has_feature(c_thread_local)))
234// clang-format on
235#if __cplusplus >= 201103L \
236 && (GNUC_PREREQ(4, 8) || __has_feature(cxx_thread_local))
237#define _Thread_local thread_local
238#elif defined(__GNUC__)
239#define _Thread_local __thread
240#elif defined(_MSC_VER) || defined(__declspec) \
241 || __has_declspec_attribute(thread)
242#define _Thread_local __declspec(thread)
243#else
244#define _Thread_local
245#endif
246#endif
247
248#ifndef __builtin_expect
249#if defined(__GNUC__) || __has_builtin(__builtin_expect)
250#else
251#define __builtin_expect(exp, c) (exp)
252#endif
253#endif
254
255#ifndef format_printf__
256#if defined(__GNUC__) || __has_attribute(__format__)
257#ifdef __MINGW32__
258#define format_printf__(i, j) \
259 __attribute__((__format__(__gnu_printf__, (i), (j))))
260#else
261#define format_printf__(i, j) __attribute__((__format__(__printf__, (i), (j))))
262#endif
263#else
264#define format_printf__(i, j)
265#endif
266#endif
267
268#ifndef __likely
273#define __likely(x) __builtin_expect(!!(x), 1)
274#endif
275
276#ifndef __unlikely
286#define __unlikely(x) __builtin_expect(!!(x), 0)
287#endif
288
289#ifndef __WORDSIZE
291// clang-format off
292#if !defined(__ILP32__) && (defined(__LP64__) || defined(_WIN64) \
293 || defined(_M_AMD64) || defined(__amd64__) || defined(_M_IA64) \
294 || defined(__ia64__) || defined(_M_X64) || defined(__x86_64__) \
295 || defined(__aarch64__))
296// clang-format on
297#define __WORDSIZE 64
298#else
299#define __WORDSIZE 32
300#endif
301#endif
302
303#ifndef LONG_BIT
305#ifdef _WIN32
306// long remains 32-bits on 64-bit Windows.
307#define LONG_BIT 32
308#else
309#define LONG_BIT __WORDSIZE
310#endif
311#endif
312
313#define LELY_INGORE_EMPTY_TRANSLATION_UNIT \
314 typedef int lely_ignore_empty_translation_unit__;
315
316#endif // LELY_FEATURES_H_
This header file is part of the C11 and POSIX compatibility library; it includes <stddef....