2

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

这是一个测试程序:

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

4 回答 4

3

typedef没有定义新类型,而是现有类型的别名。由于您的两种类型都是 int ,因此没有错误!见这里

于 2013-03-04T12:06:36.600 回答
3

而不是typedef int type_a;等,使用typedef struct { int value; } type_a;

于 2013-03-04T12:07:39.303 回答
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 名称与在普通声明符中声明的其他标识符共享相同的名称空间。

因此,除非您声明要钻取的唯一类型例如独特的结构类型),否则您可能不会得到您想要的。

于 2013-03-04T12:14:14.370 回答
0

而不是在基本数据类型上使用 typedef ...使用结构类型

例如

typedef struct { int a; } type_1;
typedef struct { int b; } type_2;

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

于 2013-03-04T13:04:25.927 回答