xref: /reactos/sdk/include/vcruntime/vcruntime.h (revision 25723b42)
1 /*
2  * PROJECT:     ReactOS SDK
3  * LICENSE:     MIT (https://spdx.org/licenses/MIT)
4  * PURPOSE:     Common definitions
5  * COPYRIGHT:   Copyright 2024 Timo Kreuzer (timo.kreuzer@reactos.org)
6  */
7 
8 #pragma once
9 
10 #define _VCRUNTIME_H
11 
12 #include <_mingw.h>
13 #include <sal.h>
14 #include <vadefs.h>
15 
16 #define _CRT_STRINGIZE_(_Value) #_Value
17 #define _CRT_STRINGIZE(_Value) _CRT_STRINGIZE_(_Value)
18 
19 #define _CRT_WIDE_(_String) L ## _String
20 #define _CRT_WIDE(_String) _CRT_WIDE_(_String)
21 
22 #define _CRT_CONCATENATE_(a, b) a ## b
23 #define _CRT_CONCATENATE(a, b)  _CRT_CONCATENATE_(a, b)
24 
25 #define _CRT_UNPARENTHESIZE_(...) __VA_ARGS__
26 #define _CRT_UNPARENTHESIZE(...)  _CRT_UNPARENTHESIZE_ __VA_ARGS__
27 
28 #if !defined(_MSC_VER) && !defined(__pragma)
29 #define __pragma(x) _Pragma(_CRT_STRINGIZE(x))
30 #endif
31 
32 #ifdef __cplusplus
33     #define _CRT_BEGIN_C_HEADER \
34         __pragma(pack(push, _CRT_PACKING_IDENTIFIER, _CRT_PACKING)) \
35         extern "C" {
36     #define _CRT_END_C_HEADER \
37         } \
38         __pragma(pack(pop, _CRT_PACKING_IDENTIFIER))
39 #else
40     #define _CRT_BEGIN_C_HEADER \
41         __pragma(pack(push, _CRT_PACKING_IDENTIFIER, _CRT_PACKING))
42     #define _CRT_END_C_HEADER \
43         __pragma(pack(pop, _CRT_PACKING_IDENTIFIER))
44 #endif
45 
46 _CRT_BEGIN_C_HEADER
47 
48 #ifndef _CRTIMP
49  #ifdef CRTDLL /* Defined for ntdll, crtdll, msvcrt, etc */
50   #define _CRTIMP
51  #elif defined(_DLL)
52   #define _CRTIMP __declspec(dllimport)
53  #else /* !CRTDLL && !_DLL */
54   #define _CRTIMP
55  #endif /* CRTDLL || _DLL */
56 #endif /* !_CRTIMP */
57 
58 #ifndef _VCRTIMP
59  #ifndef _VCRT_DEFINED_CRTIMP
60   #define _VCRTIMP _CRTIMP
61  #elif defined(_VCRT_BUILD) && defined(CRTDLL) && !defined(_VCRT_SAT_1)
62   #define _VCRTIMP __declspec(dllexport)
63  #else
64   #define _VCRTIMP
65  #endif
66 #endif
67 
68 #ifndef __CRTDECL
69 #define __CRTDECL __cdecl
70 #endif
71 
72 #ifndef _CONST_RETURN
73 #ifdef __cplusplus
74 #define _CONST_RETURN const
75 #define _CRT_CONST_CORRECT_OVERLOADS
76 #else
77 #define _CONST_RETURN
78 #endif
79 #endif
80 
81 #ifdef _BUILD_STD_MODULE
82  #define _VCRT_EXPORT_STD export
83 #else
84  #define _VCRT_EXPORT_STD
85 #endif
86 
87 #ifdef __GNUC__
88 #define _CRT_DEPRECATE_TEXT(_Text) __attribute__ ((deprecated))
89 #elif defined(_MSC_VER)
90 #define _CRT_DEPRECATE_TEXT(_Text) __declspec(deprecated(_Text))
91 #else
92 #define _CRT_DEPRECATE_TEXT(_Text)
93 #endif
94 
95 #ifndef _CRT_INSECURE_DEPRECATE
96 # ifdef _CRT_SECURE_NO_DEPRECATE
97 #  define _CRT_INSECURE_DEPRECATE(_Replacement)
98 # else
99 #  define _CRT_INSECURE_DEPRECATE(_Replacement) \
100     _CRT_DEPRECATE_TEXT("This may be unsafe, Try " #_Replacement " instead!")
101 # endif
102 #endif
103 
104 #ifndef _CRT_INSECURE_DEPRECATE_MEMORY
105 #define _CRT_INSECURE_DEPRECATE_MEMORY(_Replacement)
106 #endif
107 
108 #ifndef _SIZE_T_DEFINED
109 #define _SIZE_T_DEFINED
110 #undef size_t
111 #ifdef _WIN64
112 #if defined(__GNUC__) && defined(__STRICT_ANSI__)
113   typedef unsigned int size_t __attribute__ ((mode (DI)));
114 #else
115   typedef unsigned __int64 size_t;
116 #endif
117 #else
118   typedef unsigned int size_t;
119 #endif
120 #endif
121 
122 #ifndef _INTPTR_T_DEFINED
123 #define _INTPTR_T_DEFINED
124 #ifndef __intptr_t_defined
125 #define __intptr_t_defined
126 #undef intptr_t
127 #ifdef _WIN64
128 #if defined(__GNUC__) && defined(__STRICT_ANSI__)
129   typedef int intptr_t __attribute__ ((mode (DI)));
130 #else
131   typedef __int64 intptr_t;
132 #endif
133 #else
134   typedef int intptr_t;
135 #endif
136 #endif
137 #endif
138 
139 #ifndef _PTRDIFF_T_DEFINED
140 #define _PTRDIFF_T_DEFINED
141 #ifndef _PTRDIFF_T_
142 #undef ptrdiff_t
143 #ifdef _WIN64
144 #if defined(__GNUC__) && defined(__STRICT_ANSI__)
145   typedef int ptrdiff_t __attribute__ ((mode (DI)));
146 #else
147   __MINGW_EXTENSION typedef __int64 ptrdiff_t;
148 #endif
149 #else
150   typedef int ptrdiff_t;
151 #endif
152 #endif
153 #endif
154 
155 #ifndef _WCHAR_T_DEFINED
156 #define _WCHAR_T_DEFINED
157 #if defined(_MSC_VER) || !defined(__cplusplus)
158   typedef unsigned short wchar_t;
159 #endif
160 #endif
161 
162 #ifndef _CRT_ALIGN
163  #if defined (__midl) || defined(__WIDL__)
164   #define _CRT_ALIGN(x)
165  #elif defined(_MSC_VER)
166   #define _CRT_ALIGN(x) __declspec(align(x))
167  #else
168   #define _CRT_ALIGN(x) __attribute__ ((aligned(x)))
169  #endif
170 #endif
171 
172 #if defined (__midl) || defined(__WIDL__)
173   #define _VCRT_ALIGN(x)
174 #elif defined(_MSC_VER)
175   #define _CRT_ALIGN(x) __declspec(align(x))
176 #else
177   #define _VCRT_ALIGN(x) __attribute__ ((aligned(x)))
178 #endif
179 
180 #if defined __cplusplus
181     typedef bool  __vcrt_bool;
182 #elif defined __midl
183     typedef char __vcrt_bool;
184 #else
185     typedef _Bool __vcrt_bool;
186 #endif
187 
188 #ifndef _HAS_NODISCARD
189  #ifndef __has_cpp_attribute
190   #define _HAS_NODISCARD 0
191  #elif __has_cpp_attribute(nodiscard) >= 201603L
192   #define _HAS_NODISCARD 1
193  #else
194   #define _HAS_NODISCARD 0
195  #endif
196 #endif // _HAS_NODISCARD
197 
198 #if _HAS_NODISCARD
199  #define _NODISCARD [[nodiscard]]
200 #else
201  #define _NODISCARD
202 #endif // _HAS_NODISCARD
203 
204 #if defined _M_X64 || defined _M_ARM || defined _M_ARM64
205     #define _UNALIGNED __unaligned
206 #else
207     #define _UNALIGNED
208 #endif
209 
210 #ifdef __cplusplus
211     // Safer than the C definition, as it ensures that the argument is not a pointer
212     extern "C++" template<typename _T, size_t _Size>
213     char (*__crt_countof_helper(_UNALIGNED _T(&_Array)[_Size]))[_Size];
214     #define __crt_countof(_Array) sizeof(*__crt_countof_helper(_Array))
215 #else
216     #define __crt_countof(_Array) (sizeof(_Array) / sizeof(_Array[0]))
217 #endif
218 
219 void __cdecl __security_init_cookie(void);
220 extern uintptr_t __security_cookie;
221 
222 _CRT_END_C_HEADER
223