在内置类型中使用typedef(或#defines) - 任何明智的原因?

时间:2009-05-13 23:14:15

标签: c++ c coding-style

我正在做一些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那样很快就会被重新定义。

我能想到:

  1. 编写平台/编译器可移植代码(在C / C ++中未指定类型的大小)
  2. 在嵌入式系统上节省空间和时间 - 如果在8位微处理器写入时循环使用小于255的数组:

     for(uint8_t ii = 0; ii < len; ii++)
    

    会给出可测量的加速。

5 个答案:

答案 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,以获得特定体系结构上那么多未签名的存储,因此您的代码可以在操作系统和体系结构之间保持一致。