6.2.7 兼容类型与组合类型

1、两个类型具有兼容类型,如果它们的类型是相同的。用于判定两个类型是否兼容的其它规则在6.7.2关于类型说明符中,6.7.3关于类型说明符中,6.7.6关于声明符中描述。[注:两个类型不需要完全相同而为兼容。]此外,声明在独立翻译单元中的两个结构体、联合体、枚举类型是兼容的,如果它们的标签以及成员满足以下要求:如果这两个类型在它们相应翻译单元中都是完整的,那么要应用以下额外的要求:在它们的成员之间应该要有一个一一对应关系,以至于相应成员的每一对以相兼容的类型来声明;如果成员对的其中一个成员用一个对齐说明符来声明,那么另一个要用等价的对齐说明符来声明;并且如果声明对的其中一个成员用一个名字声明,那么另一个要用相同的名字来声明。对于两个结构体,相应的成员应该以相同的次序来声明。对于两个结构体或联合体,相应的位域应该具有相同的宽度。对于两个枚举,相应的成员应该具有相同的值。

2、引用同一个对象或函数的所有声明应该具有相兼容的类型;否则,行为是未定义的。

3、一个组合类型可以从两个相互兼容的类型来构建;组合类型是与两个类型都兼容并且满足以下条件的类型:

——如果两个类型都是数组类型,那么要应用以下规则:

• 如果一个类型是一个已知常量大小的数组,那么组合类型是那个大小的一个数组。

• 否则,如果一个类型是一个变长数组,其大小通过一个尚未被计算的表达式指定,那么行为是未定义的。

• 否则,如果一个类型是一个变长数组,其大小已被指定,那么组合类型是那个大小的一个变长数组。

• 否则,如果一个类型是一个变长数组,其大小未指定,那么组合类型是一个未指定大小的变长数组。

• 否则,两个类型都是未知大小的两个数组,并且组合类型是一个未知大小的数组。

组合类型的元素类型是两个元素的组合类型。

如果仅有一个类型是带有一个形参类型列表的函数类型(一个函数原型),那么该组合类型是带有形参类型列表的函数原型。

——如果两个类型都是带有形参类型列表的函数类型,那么在组合形参类型中的每个形参的类型是相应形参的组合类型。

这些规则递归地运用于从两个类型派生出来的类型。

4、对于声明在一个作用域中的带有内部或外部连接的一个标识符,在此作用域中该标识符的声明是可见的[注:见6.2.1中所指定的,后续的声明可能隐藏先前的声明],如果先前的声明指定了内部或外部连接,那么在后续声明上的该标识符的类型变为组合类型。

5、例子:给定以下两个文件作用域的声明:

int f(int (*)(), double (*)[]);
int f(int (*)(char*), double (*)[]);

该函数的结果组合类型为:

int f(int (*)(char*), double (*)[]);

ISO/IEC 9899:2011 条款6.2.7——兼容类型与组合类型的更多相关文章

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

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

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

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

  3. ISO/IEC 9899:2011 条款6.4.2——标识符

    6.4.2 标识符 6.4.2.1 通用 语法 1.identifier: identifier-nodigit identifier    identifier-nondigit identifie ...

  4. ISO/IEC 9899:2011 条款6.4.3——通用字符名

    6.4.3 通用字符名 语法 1.通用字符名: universal_character-name: \u hex-quad(四位十六进制数) \U hex-quad hex-quad hex-quad ...

  5. ISO/IEC 9899:2011 条款6.8.6——跳转语句

    6.8.6 跳转语句 语法 1.jump-statement: goto    identifier    ; continue    ; break    ; return    expressio ...

  6. ISO/IEC 9899:2011 条款6.7.9——初始化

    6.7.9 初始化 语法 1.initializer: assignment-expression {    initializer-list    } {    initializer-list   ...

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

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

  8. ISO/IEC 9899:2011 条款6.3.1——算术操作数

    6.3.1 算术操作数 6.3.1.1 布尔.字符以及整数 1.每个整数类型具有一个整数转换等级,如下定义: ——两个带符号的整数类型都不应该具有相同等级,即使它们具有相同的表示. ——一个带符号整数 ...

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

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

随机推荐

  1. 《Python编程:从入门到实践》第三章 列表简介 习题答案

    #3.1 names=['lpr','tjl','gnl','by','dqy']; print(names[0]); print(names[1]); print(names[2]); print( ...

  2. 自动构建的deploy.sh

    #!/usr/bin/env sh # 当发生错误时中止脚本 set -e # 构建 npm run build # cd 到构建输出的目录下 cd dist # 部署到自定义域域名 # echo ' ...

  3. linux systemd 从简单的例子入门

    linux systemd 从简单的例子入门 网上很多相关链接,一上来就给一大堆命令和讲解,让人头都大. 我们希望有一个service(服务),让它在开机启动的时候就执行. 用 root 登陆以后: ...

  4. python listdir() 中文路径 中文文件夹 乱码 解决方法

    python listdir() 中文路径 中文文件夹 乱码 解决方法 listdir(path)返回的结果的编码似乎和我们提供的 path 参数的编码有关: path = 'd:/test' try ...

  5. 使用poi进行数据的导出Demo

    这是本人在项目中遇到了一个导出数据时,如果该条数据中包含汉字,就会出现excel单元格的大小与期望的样式不一样,也是查找了半天,也没有发现哪里出的问题. 现将一个小Demo奉献在这里,可以在遇到使用p ...

  6. 图片处理:html文本获取图片Url,判断图片大小,存数据库

    1.从html文本获取图片Url /** * html文本中取出url链接 */ public class Url { public static void main(String[] args) { ...

  7. 遇见zTree和chrome的俩坑

    今天后台系统发现一bug,就是前几天用zTree做的树形结构,今下午突然不好使了,然后就查问题.我自己电脑装的是chrome浏览器,后台debug一看传的json数据,没毛病,想当然的断定不是数据的问 ...

  8. 多任务5-协程(IO密集型适用)--gevent完成多任务及monkey补丁

    代码: import gevent def f1(n): for i in range(n): print(gevent.getcurrent(),i) gevent.sleep(1) def f2( ...

  9. mysql - 所有笔记

    # 编码: 1. 查看创建数据库时设置的编码格式: shwo create database 数据库名; 2. 查看创建表时所设置的 编码格式 和 字段详细 show create table 表名; ...

  10. [bzoj 1471] 不相交路径 (容斥原理)

    题目描述 给出一个N(n<=150)N(n<=150)N(n<=150)个结点的有向无环简单图.给出444个不同的点aaa,bbb,ccc,ddd,定义不相交路径为两条路径,两条路径 ...