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

时间:2009-10-25 11:15:16

标签: c typedef

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_val max_val小于T_MAX typedef自从发现这种行为实际上是未定义的。

我是否应该删除所有这些stdint.h并在我的代码中使用{{1}}中定义的标准类型(现在尺寸已经相当稳定)?

3 个答案:

答案 0 :(得分:3)

我个人会根据max_t类型键入所有这些stdint.h等类型:

typedef uint8_t map_t;

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

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

答案 1 :(得分:2)

  • 如果编译器不支持<stdint.h>,请先查找或创建typedef版本。
  • 之后,我建议根据数据类型的使用情况为数据类型创建ss_t,如果可能的话,不建议它们的大小。您似乎混合了数据类型大小(lvl_t)和用法(_t)。这往往会成为问题,因为程序员只会随意选择其中一个或选择他们认为最容易输入的那个。
  • 从最后删除“_t”。结束于{{1}}的全局标识符由POSIX以及许多其他序列保留。

答案 2 :(得分:0)

我给你的建议是你应该保持typedef不变,只要它们被一致地使用。拥有这些typedef可能对将来重构您的程序有很大帮助。