1 /* 2 * Copyright (c) 2017 Linaro Limited 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 #ifndef ZEPHYR_INCLUDE_ZEPHYR_TYPES_H_ 8 #define ZEPHYR_INCLUDE_ZEPHYR_TYPES_H_ 9 10 #include <stddef.h> 11 #include <stdint.h> 12 13 #ifdef __cplusplus 14 extern "C" { 15 #endif 16 17 /* 18 * A type with strong alignment requirements, similar to C11 max_align_t. It can 19 * be used to force alignment of data structures allocated on the stack or as 20 * return * type for heap allocators. 21 */ 22 typedef union { 23 long long thelonglong; 24 long double thelongdouble; 25 uintmax_t theuintmax_t; 26 size_t thesize_t; 27 uintptr_t theuintptr_t; 28 void *thepvoid; 29 void (*thepfunc)(void); 30 } z_max_align_t; 31 32 /* 33 * Thread local variables are declared with different keywords depending on 34 * which C/C++ standard that is used. C++11 and C23 uses "thread_local" whilst 35 * C11 uses "_Thread_local". Previously the GNU "__thread" keyword was used 36 * which is the same in both gcc and g++. 37 */ 38 #ifndef Z_THREAD_LOCAL 39 #if defined(__cplusplus) && (__cplusplus) >= 201103L /* C++11 */ 40 #define Z_THREAD_LOCAL thread_local 41 #elif defined(__STDC_VERSION__) && (__STDC_VERSION__) >= 202311L /* C23 */ 42 #define Z_THREAD_LOCAL thread_local 43 #elif defined(__STDC_VERSION__) && (__STDC_VERSION__) >= 201112L /* C11 */ 44 #define Z_THREAD_LOCAL _Thread_local 45 #else /* Default back to old behavior which used the GNU keyword. */ 46 #define Z_THREAD_LOCAL __thread 47 #endif 48 #endif /* Z_THREAD_LOCAL */ 49 50 #ifdef __cplusplus 51 /* Zephyr requires an int main(void) signature with C linkage for the application main if present */ 52 extern int main(void); 53 #endif 54 55 #ifdef __cplusplus 56 } 57 #endif 58 59 #endif /* ZEPHYR_INCLUDE_ZEPHYR_TYPES_H_ */ 60