Zephyr API Documentation  3.7.0
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
zephyr_stdint.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2019 BayLibre SAS
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef ZEPHYR_INCLUDE_TOOLCHAIN_STDINT_H_
8#define ZEPHYR_INCLUDE_TOOLCHAIN_STDINT_H_
9
10/*
11 * Some gcc versions and/or configurations as found in the Zephyr SDK
12 * (questionably) define __INT32_TYPE__ and derivatives as a long int
13 * which makes the printf format checker to complain about long vs int
14 * mismatch when %u is given a uint32_t argument, and uint32_t pointers not
15 * being compatible with int pointers. Let's redefine them to follow
16 * common expectations and usage.
17 */
18
19#if __SIZEOF_INT__ != 4
20#error "unexpected int width"
21#endif
22
23#undef __INT32_TYPE__
24#undef __UINT32_TYPE__
25#undef __INT_FAST32_TYPE__
26#undef __UINT_FAST32_TYPE__
27#undef __INT_LEAST32_TYPE__
28#undef __UINT_LEAST32_TYPE__
29#undef __INT64_TYPE__
30#undef __UINT64_TYPE__
31#undef __INT_FAST64_TYPE__
32#undef __UINT_FAST64_TYPE__
33#undef __INT_LEAST64_TYPE__
34#undef __UINT_LEAST64_TYPE__
35
36#define __INT32_TYPE__ int
37#define __UINT32_TYPE__ unsigned int
38#define __INT_FAST32_TYPE__ __INT32_TYPE__
39#define __UINT_FAST32_TYPE__ __UINT32_TYPE__
40#define __INT_LEAST32_TYPE__ __INT32_TYPE__
41#define __UINT_LEAST32_TYPE__ __UINT32_TYPE__
42#define __INT64_TYPE__ long long int
43#define __UINT64_TYPE__ unsigned long long int
44#define __INT_FAST64_TYPE__ __INT64_TYPE__
45#define __UINT_FAST64_TYPE__ __UINT64_TYPE__
46#define __INT_LEAST64_TYPE__ __INT64_TYPE__
47#define __UINT_LEAST64_TYPE__ __UINT64_TYPE__
48
49/*
50 * The confusion also exists with __INTPTR_TYPE__ which is either an int
51 * (even when __INT32_TYPE__ is a long int) or a long int. Let's redefine
52 * it to a long int to get some uniformity. Doing so also makes it compatible
53 * with LP64 (64-bit) targets where a long is always 64-bit wide.
54 */
55
56#if __SIZEOF_POINTER__ != __SIZEOF_LONG__
57#error "unexpected size difference between pointers and long ints"
58#endif
59
60#undef __INTPTR_TYPE__
61#undef __UINTPTR_TYPE__
62#define __INTPTR_TYPE__ long int
63#define __UINTPTR_TYPE__ long unsigned int
64
65/*
66 * Re-define the INTN_C(value) integer constant expression macros to match the
67 * integer types re-defined above.
68 */
69
70#undef __INT32_C
71#undef __UINT32_C
72#undef __INT64_C
73#undef __UINT64_C
74#define __INT32_C(c) c
75#define __UINT32_C(c) c ## U
76#define __INT64_C(c) c ## LL
77#define __UINT64_C(c) c ## ULL
78
79#endif /* ZEPHYR_INCLUDE_TOOLCHAIN_STDINT_H_ */