Typedef相关概念

C语言支持一种叫做typedef的机制,它允许你为各种数据类型定义新的名字typedef声明的写法和普通的声明基本相同,只是让typedef这个关键字出现在声明的前面。例如,下面这个声明:

char *ptr_to_char;

把变量ptr_to_char声明为一个指向字符的指针。但是,在添加了关键字typedef后,声明变为:

typedef char *ptr_to_char;

这个声明把标示符ptr_to_char作为指向字符的指针类型的新名字。你可以像使用任何预定义名字一样在声明中使用这个新名字,例如:

ptr_to_char a;  //声明a是一个指向字符的指针。

使用typedef声明类型可以减少使声明变得又臭又长的危险,尤其是那些复杂的声明。而且,如果你以后觉得应该修改程序使用的一些数据的类型时,修改一个typedef声明比修改程序中与这种类型有关的所有变量(和函数)的所有声明要容易得多。

 

 

一般情况下,typedef用于简洁地表示指向其他东西的指针。典型的例子是signal()原型的声明。Signal()是一种系统调用,用于通知运行时系统,当某种特定的软件中断发生时调用特定的程序。调用signal()时,通过参数传递告诉它中断的类型以及用于处理中断的程序。在ANSI C 标准中,signal的声明如下:

void ( *signal( int sig, void( *func )( int ) ) )( int );

让我们分析一下这个函数:

void( *signal( ····· ) )( int );

signal是一个函数指针,其所指向的函数接受一个int参数并返回voidsignal其中的一个参数为:

void( *func )( int )

它表示一个函数指针,所指向的函数接受一个int参数并返回void。现在,让我们看一下怎样用typedef来代表通用部分,从而简化该声明:

//ptr_to_func是一个函数指针,该函数接受一个整型参数,返回值为void

typedef void(*ptr_to_func)(int);

//signal是一个函数,它接受两个参数,其中一个是int,另一个是ptr_to_func,返回值是ptr_to_func

ptr_to_func signal( int, ptr_to_func  );

 

 

typedef define的一些区别:

1、可以用其他类型说明符对宏类型名进行扩展,但对typedef所定义的类型名却不能这么做,如下所示:

      #define peach int

      Unsigned peach i ;  /*没问题*/

      typedef int banana;

      unsigned bababa i;  /*错误!*/

2在连续几个变量的声明中,用typedef定义的类型能够保证声明中所有的变量均为同一种类型,而用#define定义的类型则无法保证,如下所示:

      #define int_ptr int *

      int_ptr chalk, cheese; 

     经过宏扩展,第二行变为

      int * chalk, cheese;

     这使得chalkcheese成为不同的类型,chalk是一个指向int的指针,而cheese则是一个int

      typedef char * char_ptr;

      char_ptr bentley, rolls_royce;

     bentleyrolls_royce的类型是相同的,都是指向char的指针

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值