1

C 中标准类型的 typedef 的推荐方法是什么?

例如,在我的项目开始时,我创建了 typedef 以使用尽可能小的类型来实现其目的。主要目的是在使用的数值范围对于类型来说太大的情况下允许轻松修改类型,而无需对整个项目进行全局搜索+替换。但六个月后我不满意,认为必须有更好的方法。

这些是我定义的类型:

/*  type to be used for storing map data within
    n*n array                                   */
typedef unsigned char map_t;

/*  type to be used for storing coordinates in map.
    min 0,max 32 (MAP_W,MAP_H defaults). note: no
    longer requires signed.                     */
typedef unsigned char xy_t;

/*  type to be used for counters, ie moves_remaining
    has max 2000                                */
typedef signed int ctr_t;

/*  type to be used for storing the level number,
    requires signed.                            */
typedef signed short lvl_t;

/*  type to be used for storing contact types,
    see actions.h CONTACT                       */
typedef signed short ct_t;

/*  small unsigned type, miscellaneous          */
typedef unsigned char su_t;

/*  small signed type, miscellaneous            */
typedef signed char ss_t;

struct xy
{
    xy_t x;
    xy_t y;
};

struct scrxy
{
    int x;
    int y;
};

struct xy_offset
{
    ss_t x;
    ss_t y;
};

一些代码,而不是使用有符号类型并检查n < 0 && n > max_val使用无符号类型,并且只检查n > max_valwhere max_valis less theT_MAX尽管我已经发现这种行为实际上是未定义的。

我是否应该删除所有这些typedefs 并在stdint.h整个代码中使用定义的标准类型(现在大小已经相当稳定了)?

4

3 回答 3

3

max_t我个人会在类型方面对所有这些等类型进行 typedef stdint.h

typedef uint8_t map_t;

除了这两种“杂项”类型之外,我自己也会使用类似的方法——启用所有关于整数转换和比较的编译器警告和错误。

如果您想要更精确的类型定义并使用 Ada,我想您需要切换编程语言:)

于 2009-10-25T11:23:09.390 回答
2
  • <stdint.h>如果您的编译器还不支持它,请先查找或创建一个版本。
  • 之后,如果可能的话,我会建议typedef根据数据类型的使用而不是它们的大小为数据类型创建 s。您似乎混合了数据类型大小 ( ss_t) 和用法 ( lvl_t)。这往往会成为问题,因为程序员只会任意选择一个或另一个,或者选择他们认为最容易输入的那个。
  • 去掉最后的“ _t”。以 结尾的全局标识符_t与许多其他序列一起被 POSIX 保留。
于 2009-10-25T12:26:13.783 回答
0

我对您的建议是,只要始终使用它们,就应该保持 typedef 原样。拥有这些 typedef 可能对将来重构您的程序有很大帮助。

于 2009-10-25T11:47:16.923 回答