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. 快上车,react 入门拾遗

    最近朋友圈和微博都刷了一波杰伦的回忆杀–说好不哭,想想都9012了,在学习react如火如荼的路上,也不妨停下脚步来总结总结,朝花夕拾一下. 为了便于阐述,我们还是来段小明和禅师的故事吧. 小明在学习 ...

  2. 【OF框架】定义框架标准WebApi,按照规范返回状态信息及数据信息

    准备 了解框架基本应用,已经完成Controller创建. 一.定义框架标准WebApi 一个标准的WebApi,包含预定义的入参和回参类型 入参为CallParams,需要增加FromBody声明, ...

  3. .NET Core 开发常用命令(VS Code)

    在开始开发 .NET Core 项目的时候,有用过 VS2017.VS Code 两个对比下来,VS 虽然开发更便捷但是 VS Code 更适合 .NET Core. 下面就总结一下常用的命令. 一. ...

  4. 六、用DataContractSerialize类序列化XML

    一.层次结构 基类:XmlObjectSerializer 派生类: DataContractSerializer NetDataContractSerializer DataContractJson ...

  5. 使用SpringTask 进行Java定时任务开发

    (我这里的案例 是模拟 将项目包放到tomcat里面运行 ) 新建一个Java Web的Maven项目....... 此过程省略... 项目结构如图: 1.pom.xml 配置 <?xml ve ...

  6. python - django (session)

    # """ # Session # 是存在服务端的键值对 # Session 必须依赖Cookie 存储Session: · 在服务器生成随机字符串 · 生成一个和上面随 ...

  7. python - scrapy 爬虫框架 ( redis去重 )

    1.  使用内置,并加以修改 ( 自定义 redis 存储的 keys ) settings 配置 # ############### scrapy redis连接 ################# ...

  8. 原生JS实现滑动验证功能

    一般很多网站都有滑动验证的功能,简单滑动验证的原理如下图所示: 主要理解思想就行 图中的代码可能和实际写的有所不同 HTML和CSS也可根据仔细的喜好就行修改 完整代码: <!DOCTYPE h ...

  9. [NOIP 2018]旅行

    题目链接 题意简介:现有一个图,小Y要把它走完,每个点只去一次,路径字典序最小. 分析:这道题我认为很重要的一个点就是它的数据范围.它只有两种 m=n-1 或 m=n.我们先考虑第一种:m=n-1也就 ...

  10. Homestead can not mount nfs on macos catalina

    It's not a vagrant issue but nfsd/macos issue.If you add to /etc/exports line:/Users/USERNAME/Docume ...