我有这些功能。
ssize_t fuc1(int var1, void *buf, size_t count);
int func2(char *charPtr, int mode, int dev);
short func3( long var2);
问题是,在不同的机器(64位和32位)上编译时,C中的数据类型具有不同的大小。即使是void *也是如此。出于某些原因。我需要确保每台机器(64位和32位)的这些尺寸都相同。那么,我应该如何修改这些?
答案 0 :(得分:12)
使用C99,<stdint.h>
和int32_t
等类型。 More details on Wikipedia
对于指针类型,没有办法做到这一点,因为根据定义,它们是特定于平台的。没有有效的用例,您可能需要它们保持一致,因为它们不可序列化。如果使用指针变量存储指针和其他数据(例如,取决于某些标志),请使用某种精确整数类型与指针类型的并集。或者,使用C99 uintptr_t
,并在需要对其进行处理时转换为指针。
答案 1 :(得分:2)
解决困境的老式方法是使用宏来定义泛型类型,并根据目标平台定义这些宏:
<强> datatypes.h 强>
#ifndef DATATYPES_H
#define DATATYPES_H
#ifdef PLATFORM_32_BIT
typedef UINT32 unsigned int; // unsigned 32-bit integer
typedef UINT16 unsigned short;
typedef UINT08 unsigned char;
#else
// Assume 64 bit platform
typedef UINT32 unsigned short;
#endif
#endif // DATATYPES_H
当您绝对需要32位无符号变量时,您将使用UINT32
类型。平台定义可以在命令行上传递给编译器。
由于我没有使用过64位平台,因此您必须研究POD类型的位大小。
答案 2 :(得分:1)
你不能,至少不能在C ++ 03或C89中。 C99有你可以使用的<stdint.h>
标题,它定义了uint32_t
等类型,但是你对C ++运气不好。
如果你需要它在C ++ 03中工作,你需要使用像Boost::Integer EDIT这样的东西,或者有TR1的实现。
答案 3 :(得分:0)
POSH library(便携式开源线束)可能对您有所帮助。这是由Write Portable Code的作者Brian Hook创建的。