use*_*723 5 c gcc compiler-warnings
在C中,或者至少在GCC中,是否有某种方式(使用typedef)是一种与任何其他类型不兼容的类型?
例如,你做:
typedef UINT UID;
typedef UINT AGE;
UID user_id;
AGE user_age;
Run Code Online (Sandbox Code Playgroud)
您可以看到两种类型都是unsigned int(我将其命名为UINT).
您可以计算user_id + user_age.
但是,你想确保UID和AGE永远不会混在一起.
这就是我想要的!
这个想法是为了代码的安全性和正确性,为某些类型指定一些限定符/属性.
然而,混合它们的唯一方法是将两者都转换为UINT,或者将user_age转换为UID.
C语言可能会非常混乱,有时候我们只是因为你使用了错误的值作为参数而只是因为你使用了错误的值作为参数,因为变量具有相似的名称......并且编译器显然永远不会抱怨,因为它们只是为了找出愚蠢的bug.有相同的类型.
我在GCC手册中没有找到任何相关内容,但我会在邮件列表中提出要求.
我只是想知道如何(而且我知道没有,我真正的问题是为什么标准和编译器不提供这个,因为我认为它非常有用并且是相对容易实现的最简单的事情之一在编译器方面)在类型(以及变量)上指定一些ATTRIBUTE,告诉编译器TYPE不应该与任何其他类型混合,除非明确地转换为它.所以真正的问题是: - 为什么这是一个坏主意?(为什么没有编译器考虑它?) - 如果存在这个GCC属性,你还会使用它吗?哦...在我看来我会在这里和那里使用它,只是把这个属性放在几乎所有的typedef然后只是编程; 在第一次编译时会检测到错误的巨大部分 - 以错误的顺序传递参数,在大而复杂的计算中使用错误的变量......
对不起,我的英语不好.
假设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;
}
Run Code Online (Sandbox Code Playgroud)
还有一些缺点.您不能将结构与运算符(+, - ,/,*等)一起使用.即.您不能将两个结构一起添加.因此,这不起作用:
AGE user1age = { 25 };
AGE user2age = { 23 };
UINT totage = user1age + user2age;
Run Code Online (Sandbox Code Playgroud)
您必须以这种方式执行此操作并在结构中显式添加年龄值:
AGE user1age = { 25 };
AGE user2age = { 23 };
UINT totage = user1age.age + user2age.age;
Run Code Online (Sandbox Code Playgroud)
使用struct
:
typedef struct
{
unsigned int uid;
} UID;
typedef struct
{
unsigned int age;
} AGE;
UID user_id;
AGE user_age;
Run Code Online (Sandbox Code Playgroud)