/* * _mingw.h * * MinGW specific macros included by ALL mingwrt include files; (this file * is part of the MinGW32 runtime library package). * * $Id$ * * Written by Mumit Khan * Copyright (C) 1999, 2001-2011, 2014-2019, MinGW.org Project * * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * 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 OR COPYRIGHT HOLDERS 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. * */ #ifndef __MINGW_H #define __MINGW_H /* In previous versions, __MINGW32_VERSION was expressed as a dotted * numeric pair, representing major.minor; unfortunately, this doesn't * adapt well to the inclusion of a patch-level component, since the * major.minor.patch dotted triplet representation is not valid as a * numeric entity. Thus, for this version, we adopt a representation * which encodes the version as a long integer value, expressing: * * __MINGW32_VERSION = 1,000,000 * major + 1,000 * minor + patch * * DO NOT EDIT these package version assignments manually; they are * derived from the package version specification within configure.ac, * whence they are propagated automatically, at package build time. */ #define __MINGW32_VERSION %PACKAGE_VERSION_LONG%L #define __MINGW32_MAJOR_VERSION %PACKAGE_VERSION_MAJOR% #define __MINGW32_MINOR_VERSION %PACKAGE_VERSION_MINOR% #define __MINGW32_PATCHLEVEL %PACKAGE_VERSION_PATCH% #if __GNUC__ >= 3 && ! defined __PCC__ #pragma GCC system_header #endif #ifndef _MSVCRTVER_H /* Legacy versions of mingwrt use the macro __MSVCRT_VERSION__ to * enable evolving features of different MSVCRT.DLL versions. This * usage is no longer recommended, but the __MSVCRT_VERSION__ macro * remains useful when a non-freely distributable MSVCRxx.DLL is to * be substituted for MSVCRT.DLL; for such usage, the substitute * MSVCRxx.DLL may be identified as specified in... */ # include #endif /* A better inference than __MSVCRT_VERSION__, of the capabilities * supported by the operating system default MSVCRT.DLL, is provided * by the Windows API version identification macros. */ #include /* The following are defined by the user (or by the compiler), to specify how * identifiers are imported from a DLL. All headers should include this first, * and then use __DECLSPEC_SUPPORTED to choose between the old ``__imp__name'' * style or the __MINGW_IMPORT style for declarations. * * __DECLSPEC_SUPPORTED Defined if dllimport attribute is supported. * __MINGW_IMPORT The attribute definition to specify imported * variables/functions. * _CRTIMP As above. For MS compatibility. * * Macros to enable MinGW features which deviate from standard MSVC * compatible behaviour; these may be specified directly in user code, * activated implicitly, (e.g. by specifying _POSIX_C_SOURCE or such), * or by inclusion in __MINGW_FEATURES__: * * __USE_MINGW_ANSI_STDIO Select a more ANSI C99 compatible * implementation of printf() and friends; * (users should not set this directly). * * Other macros: * * __int64 define to be long long. Using a typedef * doesn't work for "unsigned __int64" * * * Manifest definitions for flags to control globbing of the command line * during application start up, (before main() is called). The first pair, * when assigned as bit flags within _CRT_glob, select the globbing algorithm * to be used; (the MINGW algorithm overrides MSCVRT, if both are specified). * Prior to mingwrt-3.21, only the MSVCRT option was supported; this choice * may produce different results, depending on which particular version of * MSVCRT.DLL is in use; (in recent versions, it seems to have become * definitively broken, when globbing within double quotes). */ #define __CRT_GLOB_USE_MSVCRT__ 0x0001 /* From mingwrt-3.21 onward, this should be the preferred choice; it will * produce consistent results, regardless of the MSVCRT.DLL version in use. */ #define __CRT_GLOB_USE_MINGW__ 0x0002 /* When the __CRT_GLOB_USE_MINGW__ flag is set, within _CRT_glob, the * following additional options are also available; they are not enabled * by default, but the user may elect to enable any combination of them, * by setting _CRT_glob to the boolean sum (i.e. logical OR combination) * of __CRT_GLOB_USE_MINGW__ and the desired options. * * __CRT_GLOB_USE_SINGLE_QUOTE__ allows use of single (apostrophe) * quoting characters, analogously to * POSIX usage, as an alternative to * double quotes, for collection of * arguments separated by white space * into a single logical argument. * * __CRT_GLOB_BRACKET_GROUPS__ enable interpretation of bracketed * character groups as POSIX compatible * globbing patterns, matching any one * character which is either included * in, or excluded from the group. * * The following options, which may also be specified within _CRT_glob, * are specified in terms of their glob() flags, as defined in * * GLOB_CASEMATCH enable case sensitive matching for * globbing patterns; this is default * behaviour for POSIX, but because of * the case insensitive nature of the * MS-Windows file system, it is more * appropriate to use case insensitive * globbing as the MinGW default. * * GLOB_BRACE enable expansion of GNU style brace * delimited expression groups within * the globbing pattern. * */ #define __CRT_GLOB_USE_SINGLE_QUOTE__ 0x0010 #define __CRT_GLOB_BRACKET_GROUPS__ 0x0020 /* The MinGW globbing algorithm uses the ASCII DEL control code as a marker * for globbing characters which were embedded within quoted arguments; (the * quotes are stripped away BEFORE the argument is globbed; the globbing code * treats the marked character as immutable, and strips out the DEL markers, * before storing the resultant argument). The DEL code is mapped to this * function here; DO NOT change it, without rebuilding the runtime. */ #define __CRT_GLOB_ESCAPE_CHAR__ (char)(127) /* Load any user-customized features configuration... */ #ifdef _MINGW_FEATURES_HEADER /* ...from a user-specified, or project-specified alternative file... */ #include _MINGW_FEATURES_HEADER #else /* ...or fall back to the default configuration file, (which may, * or may not have been customized). */ #include #endif #ifndef __MINGW_FEATURES__ /* Regardless of how the preceding features configuration header was * identified, we normally expect that will have defined this, but we * supply this fall-back, just in case it is needed. */ #define __MINGW_FEATURES__ 0ULL #endif /* Define macros to facilitate the user-specified configuration. */ #define __MINGW_FEATURE_ENABLE__(__FEATURE__) | (__FEATURE__) #define __MINGW_FEATURE_IGNORE__(__FEATURE__) #define __MINGW_FEATURES_BEGIN__ 0x0000000000000000ULL #define __MINGW_FEATURES_UNSET__ 0x0000000000000000ULL #define __MINGW_FEATURES_END__ /* Manifest definitions identifying the flag bits, controlling activation * of MinGW features, as specified by the user in __MINGW_FEATURES__. */ #define __MINGW_ANSI_STDIO__ 0x0000000000000001ULL /* * The following three are not yet formally supported; they are * included here, to document anticipated future usage. */ #define __MINGW_LC_EXTENSIONS__ 0x0000000000000050ULL #define __MINGW_LC_MESSAGES__ 0x0000000000000010ULL #define __MINGW_LC_ENVVARS__ 0x0000000000000040ULL /* Try to avoid problems with outdated checks for GCC __attribute__ support. */ #undef __attribute__ #if defined (__PCC__) # undef __DECLSPEC_SUPPORTED # ifndef __MINGW_IMPORT # define __MINGW_IMPORT extern # endif # ifndef _CRTIMP # define _CRTIMP # endif # ifndef __cdecl # define __cdecl _Pragma("cdecl") # endif # ifndef __stdcall # define __stdcall _Pragma("stdcall") # endif # ifndef __int64 # define __int64 long long # endif # ifndef __int32 # define __int32 long # endif # ifndef __int16 # define __int16 short # endif # ifndef __int8 # define __int8 char # endif # ifndef __small # define __small char # endif # ifndef __hyper # define __hyper long long # endif # ifndef __volatile__ # define __volatile__ volatile # endif # ifndef __restrict__ # define __restrict__ restrict # endif # define NONAMELESSUNION #elif defined(__GNUC__) # ifdef __declspec # ifndef __MINGW_IMPORT /* Note the extern. This is needed to work around GCC's limitations in handling dllimport attribute. */ # define __MINGW_IMPORT extern __attribute__((__dllimport__)) # endif # ifndef _CRTIMP # ifdef __USE_CRTIMP # define _CRTIMP __attribute__((dllimport)) # else # define _CRTIMP # endif # endif # define __DECLSPEC_SUPPORTED # else /* __declspec */ # undef __DECLSPEC_SUPPORTED # undef __MINGW_IMPORT # ifndef _CRTIMP # define _CRTIMP # endif # endif /* __declspec */ /* * The next two defines can cause problems if user code adds the * __cdecl attribute like so: * void __attribute__ ((__cdecl)) foo(void); */ # ifndef __cdecl # define __cdecl __attribute__((__cdecl__)) # endif # ifndef __stdcall # define __stdcall __attribute__((__stdcall__)) # endif # ifndef __int64 # define __int64 long long # endif # ifndef __int32 # define __int32 long # endif # ifndef __int16 # define __int16 short # endif # ifndef __int8 # define __int8 char # endif # ifndef __small # define __small char # endif # ifndef __hyper # define __hyper long long # endif #else /* ! __GNUC__ && ! __PCC__ */ # ifndef __MINGW_IMPORT # define __MINGW_IMPORT __declspec(dllimport) # endif # ifndef _CRTIMP # define _CRTIMP __declspec(dllimport) # endif # define __DECLSPEC_SUPPORTED # define __attribute__(x) /* nothing */ #endif #if defined (__GNUC__) && defined (__GNUC_MINOR__) #define __MINGW_GNUC_PREREQ(major, minor) \ (__GNUC__ > (major) \ || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))) #else #define __MINGW_GNUC_PREREQ(major, minor) 0 #endif #ifdef __cplusplus # define __CRT_INLINE inline #else # if __GNUC_STDC_INLINE__ # define __CRT_INLINE extern inline __attribute__((__gnu_inline__)) # else # define __CRT_INLINE extern __inline__ # endif #endif # ifdef __GNUC__ /* A special form of __CRT_INLINE is provided; it will ALWAYS request * inlining when possible. Originally specified as _CRTALIAS, this is * now deprecated in favour of __CRT_ALIAS, for syntactic consistency * with __CRT_INLINE itself. */ # define _CRTALIAS __CRT_INLINE __attribute__((__always_inline__)) # define __CRT_ALIAS __CRT_INLINE __attribute__((__always_inline__)) # else # define _CRTALIAS __CRT_INLINE /* deprecated form */ # define __CRT_ALIAS __CRT_INLINE /* preferred form */ # endif /* * Each function which is implemented as a __CRT_ALIAS should also be * accompanied by an externally visible interface. The following pair * of macros provide a mechanism for implementing this, either as a stub * redirecting to an alternative external function, or by compilation of * the normally inlined code into free standing object code; each macro * provides a way for us to offer arbitrary hints for use by the build * system, while remaining transparent to the compiler. */ #define __JMPSTUB__(__BUILD_HINT__) #define __LIBIMPL__(__BUILD_HINT__) #ifdef __cplusplus # define __UNUSED_PARAM(x) #else # ifdef __GNUC__ # define __UNUSED_PARAM(x) x __attribute__((__unused__)) # else # define __UNUSED_PARAM(x) x # endif #endif #ifdef __GNUC__ #define __MINGW_ATTRIB_NORETURN __attribute__((__noreturn__)) #define __MINGW_ATTRIB_CONST __attribute__((__const__)) #else #define __MINGW_ATTRIB_NORETURN #define __MINGW_ATTRIB_CONST #endif #if __MINGW_GNUC_PREREQ (3, 0) #define __MINGW_ATTRIB_MALLOC __attribute__((__malloc__)) #define __MINGW_ATTRIB_PURE __attribute__((__pure__)) #else #define __MINGW_ATTRIB_MALLOC #define __MINGW_ATTRIB_PURE #endif /* Attribute `nonnull' was valid as of gcc 3.3. We don't use GCC's variadiac macro facility, because variadic macros cause syntax errors with --traditional-cpp. */ #if __MINGW_GNUC_PREREQ (3, 3) #define __MINGW_ATTRIB_NONNULL(arg) __attribute__((__nonnull__(arg))) #else #define __MINGW_ATTRIB_NONNULL(arg) #endif /* GNUC >= 3.3 */ #if __MINGW_GNUC_PREREQ (3, 1) #define __MINGW_ATTRIB_DEPRECATED __attribute__((__deprecated__)) #else #define __MINGW_ATTRIB_DEPRECATED #endif /* GNUC >= 3.1 */ #if __MINGW_GNUC_PREREQ (3, 3) #define __MINGW_NOTHROW __attribute__((__nothrow__)) #else #define __MINGW_NOTHROW #endif /* GNUC >= 3.3 */ /* TODO: Mark (almost) all CRT functions as __MINGW_NOTHROW. This will allow GCC to optimize away some EH unwind code, at least in DW2 case. */ /* Activation of MinGW specific extended features: */ #ifdef __USE_MINGW_ANSI_STDIO /* Users should not set this directly; rather, define one (or more) * of the feature test macros (tabulated below), or specify any of the * compiler's command line options, (e.g. -posix, -ansi, or -std=c...), * which cause _POSIX_SOURCE, or __STRICT_ANSI__ to be defined. */ # warning "Direct definition of __USE_MINGW_ANSI_STDIO is deprecated." # pragma message "See <_mingw.h> for preferred feature activation methods." #else /* ! defined __USE_MINGW_ANSI_STDIO */ /* We must check this BEFORE we specifiy any implicit _POSIX_C_SOURCE, * otherwise we would always implicitly choose __USE_MINGW_ANSI_STDIO, * even if none of these selectors are specified explicitly... */ # if defined __STRICT_ANSI__ || defined _SVID_SOURCE \ || defined _ISOC99_SOURCE || defined _ISOC11_SOURCE \ || defined _POSIX_SOURCE || defined _POSIX_C_SOURCE \ || defined _XOPEN_SOURCE || defined _XOPEN_SOURCE_EXTENDED \ || defined _GNU_SOURCE || defined _BSD_SOURCE /* * but where any of these source code qualifiers are specified, * then assume ANSI I/O standards are preferred over Microsoft's... */ # define __USE_MINGW_ANSI_STDIO __MINGW_ANSI_STDIO__ # else /* otherwise use whatever __MINGW_FEATURES__ specifies... */ # define __USE_MINGW_ANSI_STDIO (__MINGW_FEATURES__ & __MINGW_ANSI_STDIO__) # endif #endif /* Some applications may define _XOPEN_SOURCE, without assigning any * value to it. Such usage may have been permitted in early SUS, but * it became obsolete as of SUSv2. Attempt to detect obsolete usage, * as it makes an effective evaluation of any _XOPEN_SOURCE version * dependency difficult, (without the use of ugly kludges at EVERY * point of reference which attempts a version comparison). */ #define __paste(prefix,suffix) prefix ## suffix #define __valueless(token) ((token - 0) == 0) && (__paste(token,10) == 10) #if defined _XOPEN_SOURCE && __valueless(_XOPEN_SOURCE) /* _XOPEN_SOURCE appears to have been defined without its mandatory * value; diagnose this brain-damaged obsolete usage (verbosely)... */ #warning "_XOPEN_SOURCE seems to have been improperly defined." #warning "Mandatory _XOPEN_SOURCE value assignment appears to be missing." #warning "Redefining _XOPEN_SOURCE to mitigate obsolete misuse." /* ...and redefine, emulating implicit behaviour of -D_XOPEN_SOURCE on * the GCC command line, (which DOES assign an implied value of one). */ #undef _XOPEN_SOURCE #define _XOPEN_SOURCE 1 #endif #ifndef _POSIX_C_SOURCE /* Users may define this, either directly or indirectly, to explicitly * enable a particular level of visibility for the subset of those POSIX * features which are supported by MinGW; (notice that this offers no * guarantee that any particular POSIX feature will be supported). */ # if defined _XOPEN_SOURCE /* Specifying this is the preferred method for setting _POSIX_C_SOURCE; * (POSIX defines an explicit relationship to _XOPEN_SOURCE). Note that * any such explicit setting will augment the set of features which are * available to any compilation unit, even if it seeks to be strictly * ANSI-C compliant. */ # if _XOPEN_SOURCE < 500 # define _POSIX_C_SOURCE 1L /* POSIX.1-1990 / SUSv1 */ # elif _XOPEN_SOURCE < 600 # define _POSIX_C_SOURCE 199506L /* POSIX.1-1996 / SUSv2 */ # elif _XOPEN_SOURCE < 700 # define _POSIX_C_SOURCE 200112L /* POSIX.1-2001 / SUSv3 */ # else # define _POSIX_C_SOURCE 200809L /* POSIX.1-2008 / SUSv4 */ # endif # elif defined _GNU_SOURCE || defined _BSD_SOURCE || ! defined __STRICT_ANSI__ /* * No explicit level of support has been specified; implicitly grant * the most comprehensive level to any compilation unit which requests * either GNU or BSD feature support, or does not seek to be strictly * ANSI-C compliant. */ # define _POSIX_C_SOURCE 200809L # if ! defined _EMULATE_GLIBC && ! defined _POSIX_SOURCE /* For this default case, unless it has already been specified * otherwise, we enable some GNU glibc extensions, which may be * considered as violations of strict POSIX.1 conformance. */ # define _EMULATE_GLIBC 1 # endif # elif defined _POSIX_SOURCE /* Now formally deprecated by POSIX, some old code may specify this; * it will enable a minimal level of POSIX support, in addition to the * limited feature set enabled for strict ANSI-C conformity. */ # define _POSIX_C_SOURCE 1L # endif #endif #if _POSIX_C_SOURCE >= 199506L /* Conformance with POSIX.1-1996 has been requested; ensure that any * interfaces which have been marked as "obsolescent", from this POSIX * version onwards, will be reported as "deprecated", at point of use. */ # define __POSIX_1996_DEPRECATED __MINGW_ATTRIB_DEPRECATED #else /* POSIX.1-1996 conformance is NOT required; do not object to use of * interfaces which became "obsolescent" in this POSIX version, but * were still fully supported in earlier versions. */ # define __POSIX_1996_DEPRECATED #endif #if _POSIX_C_SOURCE >= 200112L /* Conformance with POSIX.1-2001 has been requested; ensure that any * interfaces which have been marked as "obsolescent", from this POSIX * version onwards, will be reported as "deprecated", at point of use. */ # define __POSIX_2001_DEPRECATED __MINGW_ATTRIB_DEPRECATED #else /* POSIX.1-2001 conformance is NOT required; do not object to use of * interfaces which became "obsolescent" in this POSIX version, but * were still fully supported in earlier versions. */ # define __POSIX_2001_DEPRECATED #endif #if _POSIX_C_SOURCE >= 200809L /* Conformance with POSIX.1-2008 has been requested; ensure that any * interfaces which have been marked as "obsolescent", from this POSIX * version onwards, will be reported as "deprecated", at point of use. */ # define __POSIX_2008_DEPRECATED __MINGW_ATTRIB_DEPRECATED #else /* POSIX.1-2008 conformance is NOT required; do not object to use of * interfaces which became "obsolescent" in this POSIX version, but * were still fully supported in earlier versions. */ # define __POSIX_2008_DEPRECATED #endif #ifndef _ISOC99_SOURCE /* libmingwex.a provides free-standing implementations for many of the * functions which were introduced in C99; MinGW headers do not expose * prototypes for these, unless this feature test macro is defined, by * the user, or implied by other standards. We will use a bit-mapped * representation, comprising the bit-wise sum of: * * 0x08 user declared * 0x04 required by C compiler, supporting ISO-C99 * 0x02 required by C++ compiler, supporting ISO-C++11 * 0x01 required to support recent POSIX.1 features * * to ensure that we can identify the reason for implicit declaration, * (in the event that we may need to discriminate). */ # if __STDC_VERSION__ >= 199901L /* This represents a compiler supporting ISO-C99; enable all potential * use of ISO-C99 features, (to the maximum extent supportable), which * presumably also covers all C++11 and POSIX.1 usage. */ # define _ISOC99_SOURCE 0x07 # elif __cplusplus >= 201103L /* C++11 also incorporates many (if not all) of the ISO-C99 features, * which we have guarded by _ISOC99_SOURCE; enable such features, to * the required extent, (which is likely also sufficient to support * any POSIX.1 dependencies). */ # define _ISOC99_SOURCE 0x03 # elif _POSIX_C_SOURCE >= 200112L /* This represents the minimum level of ISO-C99 support, which may be * required by POSIX.1, (and which may be no less than full support). */ # define _ISOC99_SOURCE 0x01 # endif #else /* The the user has explicitly declared a source level dependency on * ISO-C99 features; regardless of how it was declared, redefine it to * ensure that any plausible dependency is covered. */ # undef _ISOC99_SOURCE # define _ISOC99_SOURCE 0x0F #endif /* _ISOC99_SOURCE */ #if _ISOC99_SOURCE && __cplusplus >= 201103L && __GNUC__ < 6 /* Due to a configuration defect in GCC versions prior to GCC-6, when * compiling C++11 code, the ISO-C99 functions may not be incorporated * into the appropriate namespace(s); we may be able to mitigate this, * by ensuring that these GCC configuration macros are defined. */ # define _GLIBCXX_USE_C99 1 # define _GLIBCXX_HAVE_WCSTOF 1 #endif #if ! defined _MINGW32_SOURCE_EXTENDED && ! defined __STRICT_ANSI__ /* Enable mingw32 extensions by default, except when __STRICT_ANSI__ * conformity mode has been enabled. */ # define _MINGW32_SOURCE_EXTENDED 1 #endif #endif /* __MINGW_H: $RCSfile$: end of file */