我如何让gcc告诉我我传递了错误的标量类型?

时间:2013-03-04 12:03:18

标签: c gcc typedef

我的代码传递指向标量类型的指针,这些标量类型代表容易混淆的不同事物。我认为编译器可以帮助我。

这是一个测试程序:

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 
$ 

我是否有一种优雅的方法可以编写等效的代码,但是当我犯了这么可怕的错误时,编译器会抛出错误?

4 个答案:

答案 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;

这可能会解决问题,编译器会抛出警告/错误