我正在做一些Java-C集成,并且使用C库werid类型映射(更多的是它们);)
#define CHAR char /* 8 bit signed int */
#define SHORT short /* 16 bit signed int */
#define INT int /* "natural" length signed int */
#define LONG long /* 32 bit signed int */
typedef unsigned char BYTE; /* 8 bit unsigned int */
typedef unsigned char UCHAR; /* 8 bit unsigned int */
typedef unsigned short USHORT; /* 16 bit unsigned int */
typedef unsigned int UINT; /* "natural" length unsigned int*/
有没有合理的理由不使用它们?它不会像char
那样很快就会被重新定义。
我能想到:
在嵌入式系统上节省空间和时间 - 如果在8位微处理器写入时循环使用小于255的数组:
for(uint8_t ii = 0; ii < len; ii++)
会给出可测量的加速。
答案 0 :(得分:4)
这正是原因所在。 C在许多系统中使用,实际上相当令人不安的是平台/硬件/版本之间的类型大小实际发生变化的频率。
答案 1 :(得分:2)
C标准没有指定多个整数类型的大小;它取决于编译器以及运行代码的处理器。
因此,为了获得最大的可移植性,最好使用一个标头,该标头使用标准名称来表示每种类型对于该特定目标的大小。
MISRA-C和其他人使用uint16_t,sint32_t等。一种较短的形式,例如u16,s32也在使用中。
关于#define v typedef:使用typedef,强制编译器进行类型检查。
答案 2 :(得分:1)
你说的还有更多...... 其中一些必须像INT32和INT64
默认情况下,int没有标准大小。允许为32位或64位。
因此,如上所述的声明有助于编写可移植代码,您可以做出安全假设,INT32将始终为我提供32位int。
答案 3 :(得分:1)
问:使用typedef还是#defines?
答:嗯,定义是预处理器指令,但是typedef实际上是由编译器执行的。就个人而言,我更喜欢使用typedef进行类型定义,并为常量和函数包装器定义等等。
答案 4 :(得分:0)
不仅适用于跨操作系统的可移植性,还适用于跨架构,例如32位和64位计算机之间。
想象一下,你在32位机器上写了一些网络代码,它使用两个无符号整数来存储64个连续的位标志。在64位计算机上编译相同的代码并且实际上可以保证不起作用,因为大多数64位计算机为int分配8个字节,因此最终会分配128位和32位之间的差距两组32位标志。这对于便携性来说显然非常糟糕。
在* nix机器上很多时候你会看到typedef专门引用为该变量分配的内存大小,例如uint16_t和uint32_t。然后对这些类型进行typedef,以获得特定体系结构上那么多未签名的存储,因此您的代码可以在操作系统和体系结构之间保持一致。