c - 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,我可以这样做。
解决方案
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
是一个可能会造成混淆的宏。首选小写变量。
推荐阅读
- django - Django“MigrationSchemaMissing:无法创建 django_migrations 表(未选择要创建的架构)”
- json - 在 Azure Cosmos DB 或 Azure Blob 中将 JSON 转换为 CSV
- javascript - JavaScript 符号不会阻止对象中的名称冲突
- json - 对 JSON 输入的合法更改使简单 jq 无效
- python - Pandas:将多个 DataFrame.apply 合二为一
- php - Expression Engine CMS 如何动态填充元标记?
- r - 您可以使用 Athena ODBC/JDBC 返回结果的 S3 位置吗?
- css - 网页中心框
- java - 由于 .so 文件,如何修复不匹配的处理器架构、意外的 e_machine
- c# - ASP.NET Core 从 azure 和数据库中删除图像 blob