首页 > 解决方案 > C typedef 正确用例

问题描述

我在 C 中定义了一堆变量(对于上下文,这些变量是您可以在 png 中找到的块的类型)。总共有 21 个,每个有 4 个字母长。到目前为止,我一直用 代表他们unsigned char[4],如下所示:

unsigned char BKGD_CHUNK[4] = {'b', 'K', 'G', 'D'};
unsigned char CHRM_CHUNK[4] = {'c', 'H', 'R', 'M'};
unsigned char DSIG_CHUNK[4] = {'d', 'S', 'I', 'G'};
unsigned char EXIF_CHUNK[4] = {'e', 'X', 'I', 'f'};
unsigned char GAMA_CHUNK[4] = {'g', 'A', 'M', 'A'};

我想知道是否不应该这样做,而应该创建一个新类型,可能称为TYPE,定义为unsigned char[4]. 我正在查找 typedef 的用例,并看到一些消息来源说当缺少它会由于重复使用而使事情变得冗长时,应该使用它。虽然只有 21 种可能的块类型,因此不会重复使用,但我觉得还是应该在这里问。

我也知道,当像这样使用 typedef 时,它会将值更改为指针,但是在我的情况下,这并不重要,如果我实际上应该使用 typedef,我可以这样做。

标签: ctypesformatting

解决方案


TYPE,定义为无符号字符[4]

要这样做

typedef unsigned char TYPE[4];

Typedef 数组非常令人困惑。

TYPE some_normal_function(); // ERROR - function cannot return an array
int some_function(TYPE var) {
     TYPE a = var; // ERROR - can't assign to array
     return sizeof(var); // returns sizeof(unsigned char*) 
                         // and __not__ sizeof(unsigned char[4])
}

除非您确实有使用数组的特定且非常明确的要求typedef并且您知道自己在做什么,否则不要使用typedef数组。在大多数情况下,使用typedef指针也会令人困惑,最好不要使用。只需使用内部包含数组的普通结构作为成员,如另一个答案中所述

请注意,按照惯例,大写字母标识符用于宏 - 其他程序员会认为这TYPE是一个可能会造成混淆的宏。首选小写变量。


推荐阅读