[C] 让VC、BCB支持C99的整数类型(stdint.h、inttypes.h)(兼容

[C] 让VC、BCB支持C99的整数类型(stdint.h、inttypes.h)(兼容GCC)

作者:zyl910

  C99标准定义了stdint.h、inttypes.h,用于统一的跨平台数据定义。可惜VC、BCB等编译器对C99的兼容性较差,香港空间,有些版本没有该头文件。本文对此进行探讨,编写了一套兼容VC、BCB、GCC的stdint.h、inttypes.h。

一、心得1.1 检查

  先检查一下各个编译器对stdint.h、inttypes.h的支持情况——VC6:stdint.h、inttypes.h都没有。VC2003:stdint.h、inttypes.h都没有。VC2005:stdint.h、inttypes.h都没有。VC2010:有stdint.h,没有inttypes.h。BCB6:有stdint.h,没有inttypes.h。GCC 4.7.0(Fedora 17):stdint.h、inttypes均有。GCC 4.6.2(MinGW (20120426)):stdint.h、inttypes均有。

1.2 msinttypes

  在网上搜索,发现了msinttypes,香港服务器,它提供了兼容VC的stdint.h、inttypes.h。地址是——

  msinttypes的安装方法——将压缩包中的stdint.h、inttypes.h放在VC的include目录。

  我试用了一下,msinttypes基本上能解决问题,但觉得该方法有存在以下缺点——1. 配置麻烦。如果安装了多个版本的VC,每个目录下都要复制一份stdint.h、inttypes.h。2. VC版本区别。VC2010支持了stdint.h,是否还需要复制msinttypes的stdint.h呢?3. 只支持VC平台。msinttypes的头文件用条件编译检查是不是VC编译器,不允许在其他编译器上编译。4. 存在一些小Bug,例如——VC6不支持“I32”长度控制字符串、VC6编译C++程序时wchar.h会报错。

1.3 我的做法

  我希望有这一套头文件——自动判断当前编译器是否支持C99标准的stdint.h、inttypes.h,如果支持就使用编译器的,否则使用自己来定义。

  这套头文件叫什么名字呢?就叫stdint.h、inttypes.h。它们和程序源码放在一起,香港服务器租用,程序源码使用include引号方式包含这些头文件。而在这些头文件中,可以使用include尖括号方式包含系统的头文件。(注:include尖括号方式只搜索系统目录中的头文件。而include引号方式是优先搜索用户目录,找不到时再搜索系统目录。)  对于主程序来说,只需将“#include <stdint.h>”改为“#include “stdint.h””就能使这些头文件生效了。而且就算用户目录下没有这些头文件(例如删除了),include引号方式就会使用系统目录中的stdint.h、inttypes.h,程序依然能成功编译。

  至于判断当前编译器是否支持C99标准的stdint.h、inttypes.h。可以根据编译器的预定义宏来判断。

二、全部代码

  stdint.h——

#ifndef _STDINT_H_ALL_#define _STDINT_H_ALL__STDINT_H_SYS__STDINT_H_SYS__MSC_VER >=1600 _STDINT_H_SYS_defined(__BORLANDC__) __BORLANDC__ >=0x0560 _STDINT_H_SYS__INTTYPES_H_SYS_ #ifdef _STDINT_H_SYS_// 使用编译器提供的<stdint.h>#include <stdint.h>#ifndef _MSC_STDINT_H_ _MSC_STDINT_H_#include <limits.h>// For Visual Studio 6 in C++ mode and for many Visual Studio versions when// compiling for ARM we should wrap <wchar.h> include with ‘extern “C++” {}’// or compiler give many errors like this:// error C2733: second C linkage of overloaded function ‘wmemchr’ not allowed//#ifdef __cplusplus//extern “C” {//#endif//# include <wchar.h>//#ifdef __cplusplus//}//#endif// 在VC6下测试时, 发现上面的方法会报告很多C2733错误. 还是直接include算了.#include <wchar.h>// Define _W64 macros to mark types changing their size, like intptr_t.#ifndef _W64# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300#define _W64 __w64# else#define _W64# endif#endif// 7.18.1 Integer types// 7.18.1.1 Exact-width integer types// Visual Studio 6 and Embedded Visual C++ 4 doesn’t// realize that, e.g. char has the same size as __int8(_MSC_VER < 1300)typedef signed charint8_t;typedef signed shortint16_t;typedef signed intint32_t;typedef unsigned charuint8_t;typedef unsigned short uint16_t;typedef unsigned intuint32_t;#elsetypedef signed __int8int8_t;typedef signed __int16 int16_t;typedef signed __int32 int32_t;typedef unsigned __int8 uint8_t;typedef unsigned __int16 uint16_t;typedef unsigned __int32 uint32_t;#endiftypedef signed __int64int64_t;typedef unsigned __int64uint64_t;// 7.18.1.2 Minimum-width integer typestypedef int8_t int_least8_t;typedef int16_t int_least16_t;typedef int32_t int_least32_t;typedef int64_t int_least64_t;typedef uint8_t uint_least8_t;typedef uint16_t uint_least16_t;typedef uint32_t uint_least32_t;typedef uint64_t uint_least64_t;// 7.18.1.3 Fastest minimum-width integer typestypedef int8_t int_fast8_t;typedef int16_t int_fast16_t;typedef int32_t int_fast32_t;typedef int64_t int_fast64_t;typedef uint8_t uint_fast8_t;typedef uint16_t uint_fast16_t;typedef uint32_t uint_fast32_t;typedef uint64_t uint_fast64_t;// 7.18.1.4 Integer types capable of holding object pointers#ifdef _WIN64 // [ typedef signed __int64 intptr_t;typedef unsigned __int64 uintptr_t;typedef _W64 signed int intptr_t;typedef _W64 unsigned int uintptr_t;typedef int64_t intmax_t;typedef uint64_t uintmax_t;!defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) INT8_MIN((int8_t)_I8_MIN)#define INT8_MAX_I8_MAX#define INT16_MIN ((int16_t)_I16_MIN)#define INT16_MAX _I16_MAX#define INT32_MIN ((int32_t)_I32_MIN)#define INT32_MAX _I32_MAX#define INT64_MIN ((int64_t)_I64_MIN)#define INT64_MAX _I64_MAX#define UINT8_MAX _UI8_MAX#define UINT16_MAX _UI16_MAX#define UINT32_MAX _UI32_MAX#define UINT64_MAX _UI64_MAXINT_LEAST8_MIN INT8_MIN#define INT_LEAST8_MAX INT8_MAX#define INT_LEAST16_MIN INT16_MIN#define INT_LEAST16_MAX INT16_MAX#define INT_LEAST32_MIN INT32_MIN#define INT_LEAST32_MAX INT32_MAX#define INT_LEAST64_MIN INT64_MIN#define INT_LEAST64_MAX INT64_MAX#define UINT_LEAST8_MAX UINT8_MAX#define UINT_LEAST16_MAX UINT16_MAX#define UINT_LEAST32_MAX UINT32_MAX#define UINT_LEAST64_MAX UINT64_MAXINT_FAST8_MIN INT8_MIN#define INT_FAST8_MAX INT8_MAX#define INT_FAST16_MIN INT16_MIN#define INT_FAST16_MAX INT16_MAX#define INT_FAST32_MIN INT32_MIN#define INT_FAST32_MAX INT32_MAX#define INT_FAST64_MIN INT64_MIN#define INT_FAST64_MAX INT64_MAX#define UINT_FAST8_MAX UINT8_MAX#define UINT_FAST16_MAX UINT16_MAX#define UINT_FAST32_MAX UINT32_MAX#define UINT_FAST64_MAX UINT64_MAX// 7.18.2.4 Limits of integer types capable of holding object pointers#ifdef _WIN64 // [# define INTPTR_MIN INT64_MIN# define INTPTR_MAX INT64_MAX# define UINTPTR_MAX UINT64_MAX# define INTPTR_MIN INT32_MIN# define INTPTR_MAX INT32_MAX# define UINTPTR_MAX UINT32_MAXINTMAX_MIN INT64_MIN#define INTMAX_MAX INT64_MAX#define UINTMAX_MAX UINT64_MAX// 7.18.3 Limits of other integer types#ifdef _WIN64 // [# define PTRDIFF_MIN _I64_MIN# define PTRDIFF_MAX _I64_MAX# define PTRDIFF_MIN _I32_MIN# define PTRDIFF_MAX _I32_MAXSIG_ATOMIC_MIN INT_MIN#define SIG_ATOMIC_MAX INT_MAX#ifndef SIZE_MAX // [# ifdef _WIN64 // [#define SIZE_MAX _UI64_MAX# #define SIZE_MAX _UI32_MAX# endif #ifndef WCHAR_MIN // [# define WCHAR_MIN #ifndef WCHAR_MAX // [# define WCHAR_MAX _UI16_MAXWINT_MIN 0#define WINT_MAX _UI16_MAX!defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) INT8_C(val) val##i8#define INT16_C(val) val##i16#define INT32_C(val) val##i32#define INT64_C(val) val##i64#define UINT8_C(val) val##ui8#define UINT16_C(val) val##ui16#define UINT32_C(val) val##ui32#define UINT64_C(val) val##ui64INTMAX_C INT64_C#define UINTMAX_C UINT64_C

  inttypes.h——

生活若剥去了理想梦想幻想,那生命便只是一堆空架子

[C] 让VC、BCB支持C99的整数类型(stdint.h、inttypes.h)(兼容

相关文章:

你感兴趣的文章:

标签云: