【发布时间】:2014-09-15 16:12:21
【问题描述】:
在 C 中,或者至少在 GCC 中,是否有某种方法可以使(使用 typedef)成为与任何其他类型不兼容的类型?
例如,您制作:
typedef UINT UID;
typedef UINT AGE;
UID user_id;
AGE user_age;
你可以看到这两种类型都是unsigned int(我把它命名为UINT)。
可以计算出user_id + user_age。
但是,您要确保 UID 和 AGE 永远不会混合。
这就是我想要的!
这个想法是为了代码的安全性和正确性,为某些类型指定一些限定符/属性。
例如,混合它们的唯一方法是将两者都转换为 UINT,或将 user_age 转换为 UID。
C 语言可能非常令人困惑,有时我们会花几个小时来发现存在愚蠢的错误只是因为您使用了错误的值作为参数,因为变量具有相似的名称......而且编译器显然永远不会抱怨,因为他们有相同的类型。
我在 GCC 手册中没有找到任何属性,但我将在邮件列表中请求它。
我只是想知道如何(我知道没有,我真正的问题是为什么标准和编译器不提供这个,因为我认为它非常有用并且相对之一在编译器端实现的最简单的事情)在类型(以及变量)上指定一些属性,以告诉编译器 TYPE 不应该与任何其他混合,除非显式转换为它。 所以这里真正的问题是: - 为什么这是个坏主意? (为什么没有编译器考虑它?) - 如果这个 GCC 属性存在,你还会使用它吗? 哦...在我看来,我会在这里和那里使用它,只需将此属性放在几乎所有类型定义中,然后就可以编程了;在第一次编译时会检测到很大一部分错误 - 以错误的顺序传递参数,在大而复杂的计算中使用错误的变量......
对不起,我的英语不好。
【问题讨论】:
-
使用
struct和不同的标签来创建不兼容的类型。 -
吹毛求疵:“你可以看到[e]这两种类型都是无符号整数。”它们不是。两者都是
UINT类型,无论这可能被定义为什么。UINT不是 C 标准定义的类型。 -
这个功能叫做“strong typedef”,在搜索网页时应该会给你一些提示。
-
说“两种类型”都是
unsigned int不太准确。假设UINT是unsigned int的类型定义,这里只有一种类型。那一种类型恰好有至少 4 个不同的名称:unsigned int、UINT、UID和AGE。typedef不会创建新类型,兼容或其他方式;它只是为现有类型创建一个新名称。
标签: c gcc compiler-warnings