6.7.8 类型定义

语法

1、typedef-name:

identifier

约束

2、一个typedef名指定了一个可变修改的类型,然后它应该具有语句块作用域。

语义

3、在一个声明中,该声明的存储类说明符是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-listD的声明符所指定。一个typedef名共享了与其它在普通声明符中所声明的标识符相同的名字空间。

4、例1 在以下代码之后,

typedef int MILES, KLICKSP();
typedef struct { double hi, lo; } range;

其构建了:

MILES  distance;
extern KCLICKSP *metricp;
range x;
range z, *zp;

这些都是有效的声明。distance的类型是intmetricp的类型是“指向不带有形参,且返回为int的函数的指针”,而xz是指定的结构体;zp是一个指向这么一个结构体的指针。distance对象具有与int对象相兼容的类型。

5、例2 在下列声明之后

typedef struct s1 { int x; } t1, *tp1;
typedef struct s2 { int x; } t2, *tp2;

类型t1与由tp1所指向的类型是相兼容的。类型t1也与类型struct s1相兼容,但与类型struct s2t2、由tp2所指向的类型以及int不兼容。

6、例3 以下晦涩的构造:

typedef signed int t;
typedef int plain;
struct tag {
unsigned t : ;
const t : ;
plain r : ;
};

声明了一个typedef名t,其类型为signed int,一个typedef名plain,类型为int,以及一个结构体,含有三个位域成员,一个命名成员t,它包含了在[0, 15]范围内的值,一个匿名的const限定的位域,它(若是可被访问的话)将包含在[-15, +15]或是[-16, +15]范围内的值,以及一个命名成员r,它包含在范围[0, 31],[-15, +15]或是[-16, +15]范围内的值。(范围的选择是由实现定义的。)前两个位域声明不同在于unsigned是一个类型说明符(它迫使t作为一个结构体成员的名字),而const是一个类型限定符(它修饰t,这个t仍然视作为一个typedef名)。如果这些声明在一个内部作用域中,后面跟着以下代码,

t f(t(t));
long t;

那么一个函数f被声明为被声明为具有类型“返回signed int,带有一个匿名形参,其类型为指向返回为signed int,带有匿名形参类型signed int的函数的指针”,然后,一个标识符t具有long int类型。

7、例4 另一方面,typedef名可被用来提升代码可读性。所有下列三个对signal函数的声明指定了完全相同的类型,第一个没有用任何typedef名。

typedef void fv(int), (*pfv)(int);
void (*signal(int, void (*) (int))) (int);
fv *signal(int, fv *);
pfv signal(int, pfv);

8、例5 如果一个typedef名指定了可变长度数组类型,那么数组的长度在typedef名被定义是固定,而不是每次使用它的时候:

void copyt(int n)
{
typedef int B[n]; // B为n个int元素的数组,n现在被计算
n += ;
B a;
int b[n]; // a是n个int元素的数组,这里的n没有加1
int b[n]; // a与b具有不同大小,这里b具有加过1的大小
for(int i = ; i < n; i++)
a[i - ] = b[i];
}

结束。

最新文章

  1. Linux中文件颜色所代表的属性和颜色
  2. Java中避免表单重复提交
  3. Node.js的net模块
  4. jQuery - 9.Ajax
  5. JProfiler使用详细教程学习笔记
  6. shell 时间统计脚本
  7. Android NDK
  8. 【原】Spark数据本地性
  9. PHP金字塔的输出
  10. SQL语句的MINUS,INTERSECT和UNION ALL
  11. LeetCode——Rotate List
  12. sqlalchemy 映射的小例子
  13. php写流程管理
  14. 【HTTP】---HTTP状态码详解
  15. (贪心 区间) 51nod1091 线段的重叠
  16. python 小练习4
  17. Redis Replication
  18. LPC-LINK 2 LPC4337 TQFP144 IO
  19. 洛谷P2017晕牛
  20. python 使用eval() 可以将json格式的数据,转换为原始数据

热门文章

  1. 基于Java+Selenium的WebUI自动化测试框架(十三)-----基础页面类BasePage(Excel)
  2. MINST样例数据的神经网络学习
  3. dt6.0之mip改造-img正则替换mip-img
  4. machine learning (3)---Linear Algebra Review
  5. service worker(一)之离线应用
  6. http之browser抓包
  7. 针对jar里面的图片不显示问题
  8. H3CNE学习1 课程简介
  9. HTML5新增input标签属性
  10. 如何选择梯度下降法中的学习速率α(Gradient Descent Learning Rate Alpha)