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];
}

结束。

ISO/IEC 9899:2011 条款6.7.8——类型定义的更多相关文章

  1. ISO/IEC 9899:2011 条款6.7.3——类型限定符

    6.7.3 类型限定符 语法 1.type-qualifier: const restrict volatile _Atomic 约束 2.除了指针类型(其被引用的类型是一个对象类型)之外的类型,不应 ...

  2. ISO/IEC 9899:2011 条款6.9.1——函数定义

    6.9.1 函数定义 语法 1.function-definition: declaration-specifiers    declarator    declaration-listopt     ...

  3. ISO/IEC 9899:2011 条款6.7.7——类型名

    6.7.7 类型名 语法 1.type-name: specifier-qualifier-list    abstract-declaratoropt abstract-declarator: po ...

  4. ISO/IEC 9899:2011 条款6.7.2——类型说明符

    6.7.2 类型说明符 语法 1.type-specifier: void char short int long float double signed unsigned _Bool _Comple ...

  5. ISO/IEC 9899:2011 条款6.2.5——类型

    6.2.5 类型 1.存储在一个对象中的值或由一个函数所返回的值的意义由用于访问该对象的表达式的类型来确定.(声明为一个对象的一个标识符是最简单的这种表达式:其类型在标识符的声明中指定.)类型被划分为 ...

  6. ISO/IEC 9899:2011 条款6.2.6——类型的表示

    6.2.6 类型的表示 6.2.6.1 通用类型 1.所有类型的表示都是未指定的,除了在本小节所描述的之外. 2.除了位域(bit-field),对象由连续的一个或多个字节序列构成,这些字节序列的字节 ...

  7. ISO/IEC 9899:2011 条款3——术语、定义与符号

    3. 术语.定义与符号 1.对于此国际标准的意图,应用了以下定义.其它术语是在用斜体类型或一个语法规则左侧出现的地方定义.在本国际标准中所显式定义的术语不被假定为对其它地方所定义的类似术语的隐式引用. ...

  8. ISO/IEC 9899:2011 条款5——5.2.1 字符集

    5.2.1 字符集 1.两个字符集和它们相关联的依次顺序应该被定义:写在源文件中的集合(源字符集),以及在执行环境中被解释的集合(执行字符集).每个集合此外被划分为一个基本字符集,其内容由本子条款给出 ...

  9. ISO/IEC 9899:2011 条款5——5.1.2 执行环境

    5.1.2 执行环境 1.定义了两个执行环境:独立式(freestanding)以及宿主的(hosted).在这两种情况下,当一个派定的C函数被执行环境调用时,程序就启动.所有具有静态存储周期的对象应 ...

随机推荐

  1. 渗透之路基础 -- XXE注入漏洞

    XXE漏洞 XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件, ...

  2. 安装k8s,使用root帐号的初始化脚本

    现在稳定性差不多了.可以总结一下了. 真正使用时,有几个地方,还是确认一下,再正式运行吧. #!/bin/bash # Version V0. ---: ;fi K8S_VERSION="1 ...

  3. ClassLoader类加载器 & Java类加载机制 & 破坏双亲委托机制

    ClassLoader类加载器 Java 中的类加载器大致可以分成两类: 一类是系统提供的: 引导类加载器(Bootstrap classloader):它用来加载 Java 的核心库(如rt.jar ...

  4. 非正常卸载Chrome浏览器导致无法重新安装

    昨晚在使用selenium的时候,Chrome浏览器和Chromedriver.exe不兼容,前几天使用的时候都没问题,查看浏览器版本后发现浏览器已经自动升级为67版本(我之前安装的是61版本). 于 ...

  5. 开发指南~小程序代码构成~JSON配置

    2.1 JSON 配置 JSON 是一种数据格式,并不是编程语言,在小程序中,JSON扮演的静态配置的角色. 2.1.1 一个例子 ​先看一个例子,打开开发工具的编辑器,在根目录下可以找到 app.j ...

  6. Python 冒泡排序只适用位数相同,位数不同用a.sort()方法

    数组内容双位数排序: #coding:utf-8 print u"中文" a = ['] b = 0 c = 0 print a i =0 for j in range (len( ...

  7. SVM: 相对于logistic regression而言SVM的 cost function与hypothesis

    很多学习算法的性能都差不多,关键不是使用哪种学习算法,而是你能得到多少数据量和应用这些学习算法的技巧(如选择什么特征向量,如何选择正则化参数等) SVM在解决非线性问题上提供了强大的方法. logis ...

  8. windows部署tomcat

    一.下载相应的JDK以及tomcat的版本 JDK:jdk-8u131-windows-x64 tomcat:apache-tomcat-8.5.23-windows-x64.zip 二.JDK的安装 ...

  9. python - django (实现电子邮箱的账户注册和验证码功能)

    使用 Django 来做一个电子邮箱注册 并 发送验证码的功能 (此处以 163 邮箱为例) 一. 登陆 163 邮箱账号,  然后进行下列操作 二. settings 配置文件 # 发送邮箱验证码 ...

  10. IO多路复用的作用?

    I/O多路复用实际上就是用select, poll, epoll监听多个io对象,当io对象有变化(有数据)的时候就通知用户进程.好处就是单个进程可以处理多个socket.当然具体区别我们后面再讨论, ...