C:使类型与任何其他类型不兼容

时间:2014-09-15 16:12:21

标签: c gcc compiler-warnings

在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手册中没有找到任何相关内容,但我会在邮件列表中提出要求。

我只是想知道如何(我知道没有,我真正的问题是为什么标准和编译器不提供这个,因为我认为它真的很有用而且相对于在编译器方面实现最简单的事情)在类型上(以及在变量上)指定一些ATTRIBUTE,告诉编译器TYPE不应该与任何其他类型混合,除非明确地转换为它。 所以真正的问题是:   - 为什么这是一个坏主意? (为什么没有编译器考虑它?)   - 如果存在此GCC属性,您还会使用它吗? 哦...在我看来我会在这里和那里使用它,只是把这个属性放在几乎所有的typedef然后只是编程;在第一次编译中会检测到错误的巨大部分 - 以错误的顺序传递参数,在大而复杂的计算中使用错误的变量......

抱歉我的英语不好。

2 个答案:

答案 0 :(得分:5)

假设UINT被定义为某种类型,您可以为它们创建typedef以使它们不兼容。下面的代码给出了如何初始化和操作它们的想法。

typedef struct { UINT id; } UID;
typedef struct { UINT age; } AGE;

UID user_id = { 1234 }; /* Example of initialization of a struct */
AGE user_age = { 23 };

int main()
{
    UINT add;
    user_age.age = 25; /* example of assignment */
    add = user_id + user_age; /* Example of compile error */

    return 0;
}

也有一些缺点。您不能将结构与运算符(+, - ,/,*等)一起使用。即。您不能将两个结构一起添加。因此,这不起作用:

AGE user1age = { 25 };
AGE user2age = { 23 };
UINT totage = user1age + user2age;

你必须这样做,并在结构中明确添加年龄值:

AGE user1age = { 25 };
AGE user2age = { 23 };
UINT totage = user1age.age + user2age.age;

答案 1 :(得分:4)

使用struct s:

typedef struct 
{
  unsigned int uid;
} UID;

typedef struct
{ 
  unsigned int age;
} AGE;

UID user_id;
AGE user_age;