SDL 3.0
SDL_begin_code.h
Go to the documentation of this file.
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2023 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22/**
23 * \file SDL_begin_code.h
24 *
25 * This file sets things up for C dynamic library function definitions,
26 * static inlined functions, and structures aligned at 4-byte alignment.
27 * If you don't like ugly C preprocessor code, don't look at this file. :)
28 */
29
30/* This shouldn't be nested -- included it around code only. */
31#ifdef SDL_begin_code_h
32#error Nested inclusion of SDL_begin_code.h
33#endif
34#define SDL_begin_code_h
35
36#ifndef SDL_DEPRECATED
37# if defined(__GNUC__) && (__GNUC__ >= 4) /* technically, this arrived in gcc 3.1, but oh well. */
38# define SDL_DEPRECATED __attribute__((deprecated))
39# else
40# define SDL_DEPRECATED
41# endif
42#endif
43
44#ifndef SDL_UNUSED
45# ifdef __GNUC__
46# define SDL_UNUSED __attribute__((unused))
47# else
48# define SDL_UNUSED
49# endif
50#endif
51
52/* Some compilers use a special export keyword */
53#ifndef DECLSPEC
54# if defined(__WIN32__) || defined(__WINRT__) || defined(__CYGWIN__) || defined(__GDK__)
55# ifdef DLL_EXPORT
56# define DECLSPEC __declspec(dllexport)
57# else
58# define DECLSPEC
59# endif
60# else
61# if defined(__GNUC__) && __GNUC__ >= 4
62# define DECLSPEC __attribute__ ((visibility("default")))
63# else
64# define DECLSPEC
65# endif
66# endif
67#endif
68
69/* By default SDL uses the C calling convention */
70#ifndef SDLCALL
71#if (defined(__WIN32__) || defined(__WINRT__) || defined(__GDK__)) && !defined(__GNUC__)
72#define SDLCALL __cdecl
73#else
74#define SDLCALL
75#endif
76#endif /* SDLCALL */
77
78/* Force structure packing at 4 byte alignment.
79 This is necessary if the header is included in code which has structure
80 packing set to an alternate value, say for loading structures from disk.
81 The packing is reset to the previous value in SDL_close_code.h
82 */
83#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__BORLANDC__)
84#ifdef _MSC_VER
85#pragma warning(disable: 4103)
86#endif
87#ifdef __clang__
88#pragma clang diagnostic ignored "-Wpragma-pack"
89#endif
90#ifdef __BORLANDC__
91#pragma nopackwarning
92#endif
93#ifdef _WIN64
94/* Use 8-byte alignment on 64-bit architectures, so pointers are aligned */
95#pragma pack(push,8)
96#else
97#pragma pack(push,4)
98#endif
99#endif /* Compiler needs structure packing set */
100
101#ifndef SDL_INLINE
102#if defined(__GNUC__)
103#define SDL_INLINE __inline__
104#elif defined(_MSC_VER) || defined(__BORLANDC__) || \
105 defined(__DMC__) || defined(__SC__) || \
106 defined(__WATCOMC__) || defined(__LCC__) || \
107 defined(__DECC) || defined(__CC_ARM)
108#define SDL_INLINE __inline
109#ifndef __inline__
110#define __inline__ __inline
111#endif
112#else
113#define SDL_INLINE inline
114#ifndef __inline__
115#define __inline__ inline
116#endif
117#endif
118#endif /* SDL_INLINE not defined */
119
120#ifndef SDL_FORCE_INLINE
121#if defined(_MSC_VER)
122#define SDL_FORCE_INLINE __forceinline
123#elif ( (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) )
124#define SDL_FORCE_INLINE __attribute__((always_inline)) static __inline__
125#else
126#define SDL_FORCE_INLINE static SDL_INLINE
127#endif
128#endif /* SDL_FORCE_INLINE not defined */
129
130#ifndef SDL_NORETURN
131#if defined(__GNUC__)
132#define SDL_NORETURN __attribute__((noreturn))
133#elif defined(_MSC_VER)
134#define SDL_NORETURN __declspec(noreturn)
135#else
136#define SDL_NORETURN
137#endif
138#endif /* SDL_NORETURN not defined */
139
140/* Apparently this is needed by several Windows compilers */
141#if !defined(__MACH__)
142#ifndef NULL
143#ifdef __cplusplus
144#define NULL 0
145#else
146#define NULL ((void *)0)
147#endif
148#endif /* NULL */
149#endif /* ! macOS - breaks precompiled headers */
150
151#ifndef SDL_FALLTHROUGH
152#if (defined(__cplusplus) && __cplusplus >= 201703L) || \
153 (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202000L)
154#define SDL_FALLTHROUGH [[fallthrough]]
155#else
156#if defined(__has_attribute)
157#define SDL_HAS_FALLTHROUGH __has_attribute(__fallthrough__)
158#else
159#define SDL_HAS_FALLTHROUGH 0
160#endif /* __has_attribute */
161#if SDL_HAS_FALLTHROUGH && \
162 ((defined(__GNUC__) && __GNUC__ >= 7) || \
163 (defined(__clang_major__) && __clang_major__ >= 10))
164#define SDL_FALLTHROUGH __attribute__((__fallthrough__))
165#else
166#define SDL_FALLTHROUGH do {} while (0) /* fallthrough */
167#endif /* SDL_HAS_FALLTHROUGH */
168#undef SDL_HAS_FALLTHROUGH
169#endif /* C++17 or C2x */
170#endif /* SDL_FALLTHROUGH not defined */
171
172#ifndef SDL_MALLOC
173#if defined(__GNUC__) && (__GNUC__ >= 3)
174#define SDL_MALLOC __attribute__((malloc))
175/** FIXME
176#elif defined(_MSC_VER)
177#define SDL_MALLOC __declspec(allocator) __desclspec(restrict)
178**/
179#else
180#define SDL_MALLOC
181#endif
182#endif /* SDL_MALLOC not defined */
183
184#ifndef SDL_ALLOC_SIZE
185#if (defined(__clang__) && __clang_major__ >= 4) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
186#define SDL_ALLOC_SIZE(p) __attribute__((alloc_size(p)))
187#elif defined(_MSC_VER)
188#define SDL_ALLOC_SIZE(p)
189#else
190#define SDL_ALLOC_SIZE(p)
191#endif
192#endif /* SDL_ALLOC_SIZE not defined */
193
194#ifndef SDL_ALLOC_SIZE2
195#if (defined(__clang__) && __clang_major__ >= 4) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
196#define SDL_ALLOC_SIZE2(p1, p2) __attribute__((alloc_size(p1, p2)))
197#elif defined(_MSC_VER)
198#define SDL_ALLOC_SIZE2(p1, p2)
199#else
200#define SDL_ALLOC_SIZE2(p1, p2)
201#endif
202#endif /* SDL_ALLOC_SIZE2 not defined */