1// ISO C9x compliant stdint.h for Microsoft Visual Studio 2// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 3// 4// Copyright (c) 2006-2008 Alexander Chemeris 5// 6// Redistribution and use in source and binary forms, with or without 7// modification, are permitted provided that the following conditions are met: 8// 9// 1. Redistributions of source code must retain the above copyright notice, 10// this list of conditions and the following disclaimer. 11// 12// 2. Redistributions in binary form must reproduce the above copyright 13// notice, this list of conditions and the following disclaimer in the 14// documentation and/or other materials provided with the distribution. 15// 16// 3. The name of the author may be used to endorse or promote products 17// derived from this software without specific prior written permission. 18// 19// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 20// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 21// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 22// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 24// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 25// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 26// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 27// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 28// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29// 30/////////////////////////////////////////////////////////////////////////////// 31 32#ifndef _MSC_VER // [ 33#error "Use this header only with Microsoft Visual C++ compilers!" 34#endif // _MSC_VER ] 35 36#ifndef _MSC_STDINT_H_ // [ 37#define _MSC_STDINT_H_ 38 39#if _MSC_VER > 1000 40#pragma once 41#endif 42 43#include <limits.h> 44 45// For Visual Studio 6 in C++ mode wrap <wchar.h> include with 'extern "C++" {}' 46// or compiler give many errors like this: 47// error C2733: second C linkage of overloaded function 'wmemchr' not allowed 48#if (_MSC_VER < 1300) && defined(__cplusplus) 49 extern "C++" { 50#endif 51# include <wchar.h> 52#if (_MSC_VER < 1300) && defined(__cplusplus) 53 } 54#endif 55 56// Define _W64 macros to mark types changing their size, like intptr_t. 57#ifndef _W64 58# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 59# define _W64 __w64 60# else 61# define _W64 62# endif 63#endif 64 65 66// 7.18.1 Integer types 67 68// 7.18.1.1 Exact-width integer types 69typedef __int8 int8_t; 70typedef __int16 int16_t; 71typedef __int32 int32_t; 72typedef __int64 int64_t; 73typedef unsigned __int8 uint8_t; 74typedef unsigned __int16 uint16_t; 75typedef unsigned __int32 uint32_t; 76typedef unsigned __int64 uint64_t; 77 78// 7.18.1.2 Minimum-width integer types 79typedef int8_t int_least8_t; 80typedef int16_t int_least16_t; 81typedef int32_t int_least32_t; 82typedef int64_t int_least64_t; 83typedef uint8_t uint_least8_t; 84typedef uint16_t uint_least16_t; 85typedef uint32_t uint_least32_t; 86typedef uint64_t uint_least64_t; 87 88// 7.18.1.3 Fastest minimum-width integer types 89typedef int8_t int_fast8_t; 90typedef int16_t int_fast16_t; 91typedef int32_t int_fast32_t; 92typedef int64_t int_fast64_t; 93typedef uint8_t uint_fast8_t; 94typedef uint16_t uint_fast16_t; 95typedef uint32_t uint_fast32_t; 96typedef uint64_t uint_fast64_t; 97 98// 7.18.1.4 Integer types capable of holding object pointers 99#ifdef _WIN64 // [ 100 typedef __int64 intptr_t; 101 typedef unsigned __int64 uintptr_t; 102#else // _WIN64 ][ 103 typedef _W64 int intptr_t; 104 typedef _W64 unsigned int uintptr_t; 105#endif // _WIN64 ] 106 107// 7.18.1.5 Greatest-width integer types 108typedef int64_t intmax_t; 109typedef uint64_t uintmax_t; 110 111 112// 7.18.2 Limits of specified-width integer types 113 114#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 115 116// 7.18.2.1 Limits of exact-width integer types 117#define INT8_MIN ((int8_t)_I8_MIN) 118#define INT8_MAX _I8_MAX 119#define INT16_MIN ((int16_t)_I16_MIN) 120#define INT16_MAX _I16_MAX 121#define INT32_MIN ((int32_t)_I32_MIN) 122#define INT32_MAX _I32_MAX 123#define INT64_MIN ((int64_t)_I64_MIN) 124#define INT64_MAX _I64_MAX 125#define UINT8_MAX _UI8_MAX 126#define UINT16_MAX _UI16_MAX 127#define UINT32_MAX _UI32_MAX 128#define UINT64_MAX _UI64_MAX 129 130// 7.18.2.2 Limits of minimum-width integer types 131#define INT_LEAST8_MIN INT8_MIN 132#define INT_LEAST8_MAX INT8_MAX 133#define INT_LEAST16_MIN INT16_MIN 134#define INT_LEAST16_MAX INT16_MAX 135#define INT_LEAST32_MIN INT32_MIN 136#define INT_LEAST32_MAX INT32_MAX 137#define INT_LEAST64_MIN INT64_MIN 138#define INT_LEAST64_MAX INT64_MAX 139#define UINT_LEAST8_MAX UINT8_MAX 140#define UINT_LEAST16_MAX UINT16_MAX 141#define UINT_LEAST32_MAX UINT32_MAX 142#define UINT_LEAST64_MAX UINT64_MAX 143 144// 7.18.2.3 Limits of fastest minimum-width integer types 145#define INT_FAST8_MIN INT8_MIN 146#define INT_FAST8_MAX INT8_MAX 147#define INT_FAST16_MIN INT16_MIN 148#define INT_FAST16_MAX INT16_MAX 149#define INT_FAST32_MIN INT32_MIN 150#define INT_FAST32_MAX INT32_MAX 151#define INT_FAST64_MIN INT64_MIN 152#define INT_FAST64_MAX INT64_MAX 153#define UINT_FAST8_MAX UINT8_MAX 154#define UINT_FAST16_MAX UINT16_MAX 155#define UINT_FAST32_MAX UINT32_MAX 156#define UINT_FAST64_MAX UINT64_MAX 157 158// 7.18.2.4 Limits of integer types capable of holding object pointers 159#ifdef _WIN64 // [ 160# define INTPTR_MIN INT64_MIN 161# define INTPTR_MAX INT64_MAX 162# define UINTPTR_MAX UINT64_MAX 163#else // _WIN64 ][ 164# define INTPTR_MIN INT32_MIN 165# define INTPTR_MAX INT32_MAX 166# define UINTPTR_MAX UINT32_MAX 167#endif // _WIN64 ] 168 169// 7.18.2.5 Limits of greatest-width integer types 170#define INTMAX_MIN INT64_MIN 171#define INTMAX_MAX INT64_MAX 172#define UINTMAX_MAX UINT64_MAX 173 174// 7.18.3 Limits of other integer types 175 176#ifdef _WIN64 // [ 177# define PTRDIFF_MIN _I64_MIN 178# define PTRDIFF_MAX _I64_MAX 179#else // _WIN64 ][ 180# define PTRDIFF_MIN _I32_MIN 181# define PTRDIFF_MAX _I32_MAX 182#endif // _WIN64 ] 183 184#define SIG_ATOMIC_MIN INT_MIN 185#define SIG_ATOMIC_MAX INT_MAX 186 187#ifndef SIZE_MAX // [ 188# ifdef _WIN64 // [ 189# define SIZE_MAX _UI64_MAX 190# else // _WIN64 ][ 191# define SIZE_MAX _UI32_MAX 192# endif // _WIN64 ] 193#endif // SIZE_MAX ] 194 195// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h> 196#ifndef WCHAR_MIN // [ 197# define WCHAR_MIN 0 198#endif // WCHAR_MIN ] 199#ifndef WCHAR_MAX // [ 200# define WCHAR_MAX _UI16_MAX 201#endif // WCHAR_MAX ] 202 203#define WINT_MIN 0 204#define WINT_MAX _UI16_MAX 205 206#endif // __STDC_LIMIT_MACROS ] 207 208 209// 7.18.4 Limits of other integer types 210 211#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 212 213// 7.18.4.1 Macros for minimum-width integer constants 214 215#define INT8_C(val) val##i8 216#define INT16_C(val) val##i16 217#define INT32_C(val) val##i32 218#define INT64_C(val) val##i64 219 220#define UINT8_C(val) val##ui8 221#define UINT16_C(val) val##ui16 222#define UINT32_C(val) val##ui32 223#define UINT64_C(val) val##ui64 224 225// 7.18.4.2 Macros for greatest-width integer constants 226#define INTMAX_C INT64_C 227#define UINTMAX_C UINT64_C 228 229#endif // __STDC_CONSTANT_MACROS ] 230 231 232#endif // _MSC_STDINT_H_ ] 233