您的位置:首页 > 编程语言 > C语言/C++

跨平台C/C++数据类型定义

2014-06-28 23:36 701 查看
1 需考虑问题

1.1 编译器运行操作系统



l WINDOWS : _WIN32、WIN32;

l UNIX/LINUX: unix、__unix、__unix__;

l SunOS/SOLARIS: __SVR4、__svr4__、sun、__sun、__sun__、sparc、__sparc、__sparc__;

l HPUX: __hppa、__hppa__、__hpux、__hpux__、_HPUX_SOURCE;

l AIX: _AIX、_AIX32、_AIX41、_AIX43、_AIX51、_AIX52;

l LINUX: linux、__linux、__linux__、__gnu_linux__;

l CPU: __x86_64、__x86_64__(Intel); __amd64、__amd64__(AMD); sparc、 __sparc、__sparc__;

1.2 编译器信息

l __STDC__: ANSI C标志,值为1,说明兼容ANSI C标准;

l __GNUC__: GCC编译器编预定义宏;__GNUC__的值表示GCC版本号;

l __GNUC_MINOR__: GCC次版本号;

l __GNUC_PATCHLEVEL__: GCC编译器修订版本号,l

l __GLIBC_MINOR__: glib的次版本号;

l VC++的版本宏:

l Visual Studio 5.0 --> VC++5.0 _MSC_VER = 1100

l Visual Studio 6.0 --> VC++6.0 _MSC_VER = 1200

l Visual Studio 2002 --> VC++7.0 _MSC_VER = 1300

l Visual Studio 2003 --> VC++7.1 _MSC_VER = 1310

l Visual Studio 2005 --> VC++8.0 _MSC_VER = 1400

l Visual Studio 2008 --> VC++9.0 _MSC_VER = 1500

1.3 ISO C 标准

1.3.1 <limits.h>

char,int,short int,long,long long 限制性说明头文件。<limits.h>定义了char,int,short,long,long long 最大值最小值等。如表一所示。

表一 <limits.h>定义
Name
Description
Typical value
CHAR_BIT
Number of bits in a char
8
≥+8
SCHAR_MIN
Minimum value for a signed char
–128
≤–127
SCHAR_MAX
Maximum value for a signed char
+127
≥+127
UCHAR_MAX
Maximum value for an unsigned char
≥+255
CHAR_MIN
Minimum value for a char
–128
≤–127

(if char is represented as a signed char; otherwise ≤0)
CHAR_MAX
Maximum value for a char
+127
≥+127

(if char is represented as a

signed char; otherwise ≥+255)
MB_LEN_MAX
Maximum multi byte length

of a character across all locales
varies, usually at least 4
≥+1
SHRT_MIN
Minimum value for a short int
–32,768
≤–32,767
SHRT_MAX
Maximum value for a short int
+32,767
≥+32,767
USHRT_MAX
Maximum value for an unsigned short int
+65,535
≥+65,535
INT_MIN
Minimum value for an int
–2,147,483,648
≤–32,767
INT_MAX
Maximum value for an int
+2,147,483,647
≥+32,767
UINT_MAX
Maximum value for anunsigned int
+4,294,967,295
≥+65,535
LONG_MIN
Minimum value for a long int
32 bit compiler
–2,147,483,648
≤–2,147,483,647
64 bit compiler
–9,223,372,036,854,775,808
LONG_MAX
Maximum value for a long int
32 bit compiler
+2,147,483,647
≥+2,147,483,647
64 bit compiler
+9,223,372,036,854,775,807
ULONG_MAX
Maximum value for an unsigned long int
32 bit compiler
+4,294,967,295
≥+4,294,967,295
64 bit compiler
+18,446,744,073,709,551,615
LLONG_MIN
Minimum value for a long long int
–9,223,372,036,854,775,808
≤-9,223,372,036,854,775,807
LLONG_MAX
Maximum value for a long long int
+9,223,372,036,854,775,807
≥+9,223,372,036,854,775,807
ULLONG_MAX
Maximum value for an unsigned long long int
+18,446,744,073,709,551,615
≥+18,446,744,073,709,551,615
1.3.2 常用类型说明



l char:typical 8-bits,Many DSP may define a char-bits equal to 16 bits or more.

l short:typical 16-bits

l int:typical 16-bits or 32-bits, bits-number of int must be more than short.

l long:typical 32-bits,also larger than int

l long long:typical 64-bits

2 数据类型定义

//////////////////////////////////////////////////////////////////////////

// TOD: filename: types.h

// 1.Using this head file for data-type defining,

// Firstly make sure the type is defined

// 2.Example

// 1.Define a 8-bits variable : INT8 chVariable;

// 2.Define a 16-bits variable: INT16 snVariable;

// 3.Define a 32-bits variable: INT32 nVariable;

// 4.Define a 64-bits variable: INT64 llVariable;

//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////

//C Standards

//////////////////////////////////////////////////////////////////////////

#if defined(__STDC__)

# define PREDEF_STANDARD_C_1989

# if defined(__STDC_VERSION__)

# define PREDEF_STANDARD_C_1990

# if (__STDC_VERSION__ >= 199409L)

# define PREDEF_STANDARD_C_1994

# endif

# if (__STDC_VERSION__ >= 199901L)

# define PREDEF_STANDARD_C_1999

# endif

# endif

#endif

//////////////////////////////////////////////////////////////////////////

// Pre-C89 compilers do not recognize certain keywords.

// Let the preprocessor remove those keywords for those compilers.

//////////////////////////////////////////////////////////////////////////

#if !defined(PREDEF_STANDARD_C_1989) && !defined(__cplusplus)

# define const

# define volatile

#endif

//////////////////////////////////////////////////////////////////////////

// Define 8-bits Integer, 16-bits Integer,32-bits Integer

// All compliant compilers that support Standard C/C++

// VC++, Borland C++, Turb C++ those who support C89,but undefined __STDC__)

//////////////////////////////////////////////////////////////////////////

#if defined(__STDC__) || defined(__cplusplus) || defined(_MSC_VER) || defined(__BORLANDC__) || defined(__TURBOC__)

#include <limits.h>

// Defined 8 - bit Integer

#if defined(UCHAR_MAX) && (UCHAR_MAX == 0xFF)

typedef char INT8, *INT8_PTR;

typedef unsigned char UINT8, *INT8_PTR;

#ifndef DEFINED_INT8

#define DEFINED_INT8

#endif

#endif

// Defined 16-bits Integer

#if defined(USHRT_MAX) && (USHRT_MAX == 0xFFFF)

typedef short int INT16, *INT16_PTR;

typedef unsigned short int UINT16, *UINT16_PTR;

#ifndef DEFINED_INT16

#define DEFINED_INT16

#endif

#elif defined(UINT_MAX) && (UINT_MAX == 0xFFFF)

typedef int INT16, *INT16_PTR;

typedef unsigned int UINT16, *UINT16_PTR;

#ifndef DEFINED_INT16

#define DEFINED_INT16

#endif

#endif

// Defined 32-bits Integer

#if defined(UINT_MAX) && (UINT_MAX == 0xFFFFFFFFUL)

typedef int INT32, *INT32_PTR;

typedef unsigned int UINT32, *UINT32_PTR;

#ifndef DEFINED_INT32

#define DEFINED_INT32

#endif

#elif defined(ULONG_MAX) && (ULONG_MAX == 0xFFFFFFFFUL)

typedef long int INT32, *INT32_PTR;

typedef unsigned long int UINT32, *UINT32_PTR;

#ifndef DEFINED_INT32

#define DEFINED_INT32

#endif

#endif

#endif

//////////////////////////////////////////////////////////////////////////

// Define 64-bits Integer

// Here Only support typical systems

// such as GNU/Linux Windows UNIX Vxworks BSD Solaris

//////////////////////////////////////////////////////////////////////////

// GNU/Linux System 64-bits Integer

#if defined(__GNUC__) || defined(linux) ||defined(__linux)

#if defined (__GLIBC_HAVE_LONG_LONG) || (defined(ULLONG_MAX) && (ULLONG_MAX == 0xFFFFFFFFFFFFFFFFUL))

typedef long long INT64, *INT64_PTR;

typedef unsigned long long UINT64, *INT64_PTR;

#ifndef DEFINE_INT64

#define DEFINE_INT64

#endif

#endif

#endif

// Windows System 64-bits Integer

#if defined (WIN32) || defined (_WIN32)

#if defined(_MSC_VER) || defined(__BORLANDC__)

typedef __int64 INT64, *INT64_PTR;

typedef unsigned __int64 UINT64, *INT64_PTR;

#ifndef DEFINE_INT64

#define DEFINE_INT64

#endif

#else

typedef unsigned long long INT64, *INT64_PTR;

typedef signed long long UINT64, *INT64_PTR;

#ifndef DEFINE_INT64

#define DEFINE_INT64

#endif

#endif

#endif

// UNIX

#if defined(unix) || defined(__unix__) || defined(__unix)

# define PREDEF_PLATFORM_UNIX

#endif

#if defined(PREDEF_PLATFORM_UNIX)

#include <unistd.h>

#if defined(_XOPEN_VERSION)

#if (_XOPEN_VERSION >= 3)

#define PREDEF_STANDARD_XOPEN_1989

#endif

#if (_XOPEN_VERSION >= 4)

#define PREDEF_STANDARD_XOPEN_1992

#endif

#if (_XOPEN_VERSION >= 4) && defined(_XOPEN_UNIX)

#define PREDEF_STANDARD_XOPEN_1995

#endif

#if (_XOPEN_VERSION >= 500)

#define PREDEF_STANDARD_XOPEN_1998

#endif

#if (_XOPEN_VERSION >= 600)

#define PREDEF_STANDARD_XOPEN_2003

typedef unsigned long long INT64, *INT64_PTR;

typedef signed long long UINT64, *INT64_PTR;

#ifndef DEFINE_INT64

#define DEFINE_INT64

#endif

#endif

# endif

#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐