annotate SDL3/SDL_begin_code.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 /*
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 Simple DirectMedia Layer
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 This software is provided 'as-is', without any express or implied
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 warranty. In no event will the authors be held liable for any damages
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 arising from the use of this software.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 Permission is granted to anyone to use this software for any purpose,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 including commercial applications, and to alter it and redistribute it
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 freely, subject to the following restrictions:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 1. The origin of this software must not be misrepresented; you must not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 claim that you wrote the original software. If you use this software
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 in a product, an acknowledgment in the product documentation would be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 appreciated but is not required.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 2. Altered source versions must be plainly marked as such, and must not be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 misrepresented as being the original software.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 3. This notice may not be removed or altered from any source distribution.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 /* WIKI CATEGORY: BeginCode */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 * # CategoryBeginCode
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 * `SDL_begin_code.h` sets things up for C dynamic library function
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 * definitions, static inlined functions, and structures aligned at 4-byte
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 * alignment. If you don't like ugly C preprocessor code, don't look at this
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 * file. :)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 * SDL's headers use this; applications generally should not include this
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 * header directly.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 /* This shouldn't be nested -- included it around code only. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 #ifdef SDL_begin_code_h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 #error Nested inclusion of SDL_begin_code.h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 #define SDL_begin_code_h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 #ifdef SDL_WIKI_DOCUMENTATION_SECTION
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 * A macro to tag a symbol as deprecated.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 * A function is marked deprecated by adding this macro to its declaration:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 * ```c
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 * extern SDL_DEPRECATED int ThisFunctionWasABadIdea(void);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 * ```
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 * Compilers with deprecation support can give a warning when a deprecated
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 * function is used. This symbol may be used in SDL's headers, but apps are
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 * welcome to use it for their own interfaces as well.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 * SDL, on occasion, might deprecate a function for various reasons. However,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 * SDL never removes symbols before major versions, so deprecated interfaces
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 * in SDL3 will remain available until SDL4, where it would be expected an app
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 * would have to take steps to migrate anyhow.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 * On compilers without a deprecation mechanism, this is defined to nothing,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 * and using a deprecated function will not generate a warning.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 #define SDL_DEPRECATED __attribute__((deprecated))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 * A macro to tag a symbol as a public API.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 * SDL uses this macro for all its public functions. On some targets, it is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 * used to signal to the compiler that this function needs to be exported from
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 * a shared library, but it might have other side effects.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 * This symbol is used in SDL's headers, but apps and other libraries are
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 * welcome to use it for their own interfaces as well.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 #define SDL_DECLSPEC __attribute__ ((visibility("default")))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 * A macro to set a function's calling conventions.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 * SDL uses this macro for all its public functions, and any callbacks it
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 * defines. This macro guarantees that calling conventions match between SDL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 * and the app, even if the two were built with different compilers or
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 * optimization settings.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 * When writing a callback function, it is very important for it to be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 * correctly tagged with SDLCALL, as mismatched calling conventions can cause
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 * strange behaviors and can be difficult to diagnose. Plus, on many
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 * platforms, SDLCALL is defined to nothing, so compilers won't be able to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 * warn that the tag is missing.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 * This symbol is used in SDL's headers, but apps and other libraries are
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 * welcome to use it for their own interfaces as well.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 #define SDLCALL __cdecl
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 * A macro to request a function be inlined.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 * This is a hint to the compiler to inline a function. The compiler is free
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 * to ignore this request. On compilers without inline support, this is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 * defined to nothing.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 #define SDL_INLINE __inline
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 * A macro to demand a function be inlined.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 * This is a command to the compiler to inline a function. SDL uses this macro
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 * in its public headers for a handful of simple functions. On compilers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 * without forceinline support, this is defined to `static SDL_INLINE`, which
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 * is often good enough.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 * This symbol is used in SDL's headers, but apps and other libraries are
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 * welcome to use it for their own interfaces as well.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 #define SDL_FORCE_INLINE __forceinline
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 * A macro to tag a function as never-returning.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 * This is a hint to the compiler that a function does not return. An example
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 * of a function like this is the C runtime's exit() function.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 * This hint can lead to code optimizations, and help analyzers understand
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 * code flow better. On compilers without noreturn support, this is defined to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 * nothing.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 * This symbol is used in SDL's headers, but apps and other libraries are
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 * welcome to use it for their own interfaces as well.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 #define SDL_NORETURN __attribute__((noreturn))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 * A macro to tag a function as never-returning (for analysis purposes).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 * This is almost identical to SDL_NORETURN, except functions marked with this
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 * _can_ actually return. The difference is that this isn't used for code
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 * generation, but rather static analyzers use this information to assume
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 * truths about program state and available code paths. Specifically, this tag
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 * is useful for writing an assertion mechanism. Indeed, SDL_assert uses this
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 * tag behind the scenes. Generally, apps that don't understand the specific
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 * use-case for this tag should avoid using it directly.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 * On compilers without analyzer_noreturn support, this is defined to nothing.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 * This symbol is used in SDL's headers, but apps and other libraries are
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 * welcome to use it for their own interfaces as well.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 #define SDL_ANALYZER_NORETURN __attribute__((analyzer_noreturn))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 * A macro to signal that a case statement without a `break` is intentional.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 * C compilers have gotten more aggressive about warning when a switch's
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 * `case` block does not end with a `break` or other flow control statement,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 * flowing into the next case's code, as this is a common accident that leads
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 * to strange bugs. But sometimes falling through to the next case is the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 * correct and desired behavior. This symbol lets an app communicate this
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 * intention to the compiler, so it doesn't generate a warning.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 * It is used like this:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 * ```c
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 * switch (x) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 * case 1:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 * DoSomethingOnlyForOne();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 * SDL_FALLTHROUGH; // tell the compiler this was intentional.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 * case 2:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 * DoSomethingForOneAndTwo();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 * break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 * }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 * ```
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 #define SDL_FALLTHROUGH [[fallthrough]]
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 * A macro to tag a function's return value as critical.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 * This is a hint to the compiler that a function's return value should not be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 * ignored.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 * If an NODISCARD function's return value is thrown away (the function is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 * called as if it returns `void`), the compiler will issue a warning.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 * While it's generally good practice to check return values for errors, often
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 * times legitimate programs do not for good reasons. Be careful about what
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 * functions are tagged as NODISCARD. It operates best when used on a function
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 * that's failure is surprising and catastrophic; a good example would be a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 * program that checks the return values of all its file write function calls
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 * but not the call to close the file, which it assumes incorrectly never
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 * fails.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 * Function callers that want to throw away a NODISCARD return value can call
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 * the function with a `(void)` cast, which informs the compiler the act is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 * intentional.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 * On compilers without nodiscard support, this is defined to nothing.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 #define SDL_NODISCARD [[nodiscard]]
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 * A macro to tag a function as an allocator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 * This is a hint to the compiler that a function is an allocator, like
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 * malloc(), with certain rules. A description of how GCC treats this hint is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 * here:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 * https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-malloc-function-attribute
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 * On compilers without allocator tag support, this is defined to nothing.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 * Most apps don't need to, and should not, use this directly.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 #define SDL_MALLOC __declspec(allocator) __desclspec(restrict)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 * A macro to tag a function as returning a certain allocation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 * This is a hint to the compiler that a function allocates and returns a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 * specific amount of memory based on one of its arguments. For example, the C
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 * runtime's malloc() function could use this macro with an argument of 1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 * (first argument to malloc is the size of the allocation).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 * On compilers without alloc_size support, this is defined to nothing.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 * Most apps don't need to, and should not, use this directly.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 #define SDL_ALLOC_SIZE(p) __attribute__((alloc_size(p)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 * A macro to tag a pointer variable, to help with pointer aliasing.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 * A good explanation of the restrict keyword is here:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 * https://en.wikipedia.org/wiki/Restrict
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 * On compilers without restrict support, this is defined to nothing.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 * \since This macro is available since SDL 3.4.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 #define SDL_RESTRICT __restrict
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 * Check if the compiler supports a given builtin functionality.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 * This allows preprocessor checks for things that otherwise might fail to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 * compile.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 * Supported by virtually all clang versions and more-recent GCCs. Use this
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 * instead of checking the clang version if possible.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 * On compilers without has_builtin support, this is defined to 0 (always
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 * false).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 #define SDL_HAS_BUILTIN(x) __has_builtin(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 * A macro to specify data alignment.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 * This informs the compiler that a given datatype or variable must be aligned
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 * to a specific byte count.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 * For example:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 * ```c
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 * // make sure this is struct is aligned to 16 bytes for SIMD access.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 * typedef struct {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 * float x, y, z, w;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 * } SDL_ALIGNED(16) MySIMDAlignedData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 * // make sure this one field in a struct is aligned to 16 bytes for SIMD access.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 * typedef struct {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 * SomeStuff stuff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 * float SDL_ALIGNED(16) position[4];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 * SomeOtherStuff other_stuff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 * } MyStruct;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 * // make sure this variable is aligned to 32 bytes.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 * int SDL_ALIGNED(32) myval = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 * ```
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 * Alignment is only guaranteed for things the compiler places: local
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 * variables on the stack and global/static variables. To dynamically allocate
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 * something that respects this alignment, use SDL_aligned_alloc() or some
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 * other mechanism.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 * On compilers without alignment support, this macro is defined to an invalid
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 * symbol, to make it clear that the current compiler is likely to generate
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 * incorrect code when it sees this macro.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 * \param x the byte count to align to, so the data's address will be a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 * multiple of this value.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 * \since This macro is available since SDL 3.4.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 #define SDL_ALIGNED(x) __attribute__((aligned(x)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 /* end of wiki documentation section. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 /* `restrict` is from C99, but __restrict works with both Visual Studio and GCC. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 #ifndef SDL_RESTRICT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 # if defined(restrict) || ((defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 # define SDL_RESTRICT restrict
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 # elif defined(_MSC_VER) || defined(__GNUC__) || defined(__clang__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 # define SDL_RESTRICT __restrict
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 # else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 # define SDL_RESTRICT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 # endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 #ifndef SDL_HAS_BUILTIN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 #ifdef __has_builtin
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 #define SDL_HAS_BUILTIN(x) __has_builtin(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 #define SDL_HAS_BUILTIN(x) 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 #ifndef SDL_DEPRECATED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 # if defined(__GNUC__) && (__GNUC__ >= 4) /* technically, this arrived in gcc 3.1, but oh well. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 # define SDL_DEPRECATED __attribute__((deprecated))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 # elif defined(_MSC_VER)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 # define SDL_DEPRECATED __declspec(deprecated)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 # else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 # define SDL_DEPRECATED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 # endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 #ifndef SDL_UNUSED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 # ifdef __GNUC__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 # define SDL_UNUSED __attribute__((unused))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 # else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 # define SDL_UNUSED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 # endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 /* Some compilers use a special export keyword */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 #ifndef SDL_DECLSPEC
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 # if defined(SDL_PLATFORM_WINDOWS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 # ifdef DLL_EXPORT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 # define SDL_DECLSPEC __declspec(dllexport)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 # else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 # define SDL_DECLSPEC
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 # endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 # else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 # if defined(__GNUC__) && __GNUC__ >= 4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 # define SDL_DECLSPEC __attribute__ ((visibility("default")))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 # else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 # define SDL_DECLSPEC
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 # endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 # endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 /* By default SDL uses the C calling convention */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 #ifndef SDLCALL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 #if defined(SDL_PLATFORM_WINDOWS) && !defined(__GNUC__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 #define SDLCALL __cdecl
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 #define SDLCALL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 #endif /* SDLCALL */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 /* Force structure packing at 4 byte alignment.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 This is necessary if the header is included in code which has structure
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 packing set to an alternate value, say for loading structures from disk.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 The packing is reset to the previous value in SDL_close_code.h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 #if defined(_MSC_VER) || defined(__MWERKS__) || defined(__BORLANDC__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 #ifdef _MSC_VER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 #pragma warning(disable: 4103)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 #ifdef __clang__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 #pragma clang diagnostic ignored "-Wpragma-pack"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 #ifdef __BORLANDC__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 #pragma nopackwarning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 #ifdef _WIN64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 /* Use 8-byte alignment on 64-bit architectures, so pointers are aligned */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 #pragma pack(push,8)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 #pragma pack(push,4)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 #endif /* Compiler needs structure packing set */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 #ifndef SDL_INLINE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 #ifdef __GNUC__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 #define SDL_INLINE __inline__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 #elif defined(_MSC_VER) || defined(__BORLANDC__) || \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 defined(__DMC__) || defined(__SC__) || \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 defined(__WATCOMC__) || defined(__LCC__) || \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 defined(__DECC) || defined(__CC_ARM)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 #define SDL_INLINE __inline
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 #ifndef __inline__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 #define __inline__ __inline
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 #define SDL_INLINE inline
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 #ifndef __inline__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 #define __inline__ inline
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 #endif /* SDL_INLINE not defined */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 #ifndef SDL_FORCE_INLINE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 #define SDL_FORCE_INLINE __forceinline
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 #elif ( (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) )
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 #define SDL_FORCE_INLINE __attribute__((always_inline)) static __inline__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 #define SDL_FORCE_INLINE static SDL_INLINE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 #endif /* SDL_FORCE_INLINE not defined */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 #ifndef SDL_NORETURN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 #if defined(__GNUC__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 #define SDL_NORETURN __attribute__((noreturn))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 #elif defined(_MSC_VER)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 #define SDL_NORETURN __declspec(noreturn)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 #define SDL_NORETURN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 #endif /* SDL_NORETURN not defined */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 #ifdef __clang__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 #if __has_feature(attribute_analyzer_noreturn)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 #define SDL_ANALYZER_NORETURN __attribute__((analyzer_noreturn))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 #ifndef SDL_ANALYZER_NORETURN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 #define SDL_ANALYZER_NORETURN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 /* Apparently this is needed by several Windows compilers */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 #ifndef __MACH__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 #ifndef NULL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 #ifdef __cplusplus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 #define NULL 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 #define NULL ((void *)0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 #endif /* NULL */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 #endif /* ! macOS - breaks precompiled headers */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 #ifndef SDL_FALLTHROUGH
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 #if (defined(__cplusplus) && __cplusplus >= 201703L) || \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202000L)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 #define SDL_FALLTHROUGH [[fallthrough]]
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 #if defined(__has_attribute) && !defined(__SUNPRO_C) && !defined(__SUNPRO_CC)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 #define SDL_HAS_FALLTHROUGH __has_attribute(__fallthrough__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 #define SDL_HAS_FALLTHROUGH 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 #endif /* __has_attribute */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 #if SDL_HAS_FALLTHROUGH && \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 ((defined(__GNUC__) && __GNUC__ >= 7) || \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 (defined(__clang_major__) && __clang_major__ >= 10))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 #define SDL_FALLTHROUGH __attribute__((__fallthrough__))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 #define SDL_FALLTHROUGH do {} while (0) /* fallthrough */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 #endif /* SDL_HAS_FALLTHROUGH */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 #undef SDL_HAS_FALLTHROUGH
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 #endif /* C++17 or C2x */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 #endif /* SDL_FALLTHROUGH not defined */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 #ifndef SDL_NODISCARD
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 #if (defined(__cplusplus) && __cplusplus >= 201703L) || \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 #define SDL_NODISCARD [[nodiscard]]
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 #elif ( (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) )
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 #define SDL_NODISCARD __attribute__((warn_unused_result))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 #elif defined(_MSC_VER) && (_MSC_VER >= 1700)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 #define SDL_NODISCARD _Check_return_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 #define SDL_NODISCARD
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 #endif /* C++17 or C23 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 #endif /* SDL_NODISCARD not defined */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 #ifndef SDL_MALLOC
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 #if defined(__GNUC__) && (__GNUC__ >= 3)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 #define SDL_MALLOC __attribute__((malloc))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 /** FIXME
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 #elif defined(_MSC_VER)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 #define SDL_MALLOC __declspec(allocator) __desclspec(restrict)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 **/
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 #define SDL_MALLOC
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 #endif /* SDL_MALLOC not defined */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 #ifndef SDL_ALLOC_SIZE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 #if (defined(__clang__) && __clang_major__ >= 4) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 #define SDL_ALLOC_SIZE(p) __attribute__((alloc_size(p)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 #elif defined(_MSC_VER)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524 #define SDL_ALLOC_SIZE(p)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 #define SDL_ALLOC_SIZE(p)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 #endif /* SDL_ALLOC_SIZE not defined */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 #ifndef SDL_ALLOC_SIZE2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531 #if (defined(__clang__) && __clang_major__ >= 4) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 #define SDL_ALLOC_SIZE2(p1, p2) __attribute__((alloc_size(p1, p2)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 #elif defined(_MSC_VER)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 #define SDL_ALLOC_SIZE2(p1, p2)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536 #define SDL_ALLOC_SIZE2(p1, p2)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538 #endif /* SDL_ALLOC_SIZE2 not defined */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540 #ifndef SDL_ALIGNED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541 #if defined(__clang__) || defined(__GNUC__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 #define SDL_ALIGNED(x) __attribute__((aligned(x)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 #elif defined(_MSC_VER)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 #define SDL_ALIGNED(x) __declspec(align(x))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545 #elif defined(__cplusplus) && (__cplusplus >= 201103L)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 #define SDL_ALIGNED(x) alignas(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 #elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 #define SDL_ALIGNED(x) _Alignas(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 #define SDL_ALIGNED(x) PLEASE_DEFINE_SDL_ALIGNED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 #endif /* SDL_ALIGNED not defined */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553