我的代码传递指向标量类型的指针,这些标量类型代表容易混淆的不同事物。我认为编译器可以帮助我。
这是一个测试程序:
typedef int type_a;
typedef int type_b;
type_a do_something_with_a(type_a* pa)
{
return *pa + 3;
}
int main(void)
{
type_b b = 0;
do_something_with_a(&b); /* This is a bug. */
return 0;
}
我将B传递给一个只能用As做事的函数,但是gcc甚至没有发出警告:
$ gcc -Wall typesafe2.c
$
我是否有一种优雅的方法可以编写等效的代码,但是当我犯了这么可怕的错误时,编译器会抛出错误?
答案 0 :(得分:3)
typedef
没有定义新类型,而是定义现有类型的别名。因为你的两个类型都是int,所以没有bug!
请参阅here。
答案 1 :(得分:3)
而不是typedef int type_a;
等,请使用typedef struct { int value; } type_a;
答案 2 :(得分:2)
根据标准,您的typedef是同义词:
C99§6.7.8,p3:
在存储类说明符为typedef的声明中,每个声明符都将标识符定义为typedef名称,该名称表示以6.7.6中描述的方式为标识符指定的类型。每次按执行顺序达到typedef名称的声明时,将评估与可变长度数组声明符关联的任何数组大小表达式。 typedef声明不会引入新类型,只会引用所指定类型的同义词。也就是说,在以下声明中:
typedef T type_ident; type_ident D;
type_ident
被定义为typedef名称,其类型由T中的声明说明符指定(称为T),D中的标识符具有类型''derived-declarator- type-list T''其中derived-declarator-type-list由D的声明符指定.typedef名称与普通声明符中声明的其他标识符共享相同的名称空间。
因此,除非您声明要通过钻取的唯一类型(例如不同的结构类型),否则您可能无法获得所需的内容。
答案 3 :(得分:0)
而不是在基本数据类型上使用typedef ...使用struct type
e.g。
typedef struct { int a; } type_1;
typedef struct { int b; } type_2;
这可能会解决问题,编译器会抛出警告/错误