5.1.1 翻译环境

5.1.1.1程序结构

1、一个C程序不需要一次全被翻译完。程序的文本被保存在本国际标准中被称作为源文件(或预处理文件)的单元里。一个源文件连同所有通过指示符#include所包含的头文件以及源文件一起被称作为一个预处理翻译单元。在预处理之后,一个预处理单元被称作为一个翻译单元。先前被翻译的翻译单元可以被独立地保存或保存在库里。一个程序的各个翻译单元通过(比如)对函数(其标识符具有外部连接)的调用、对对象(其标识符具有外部连接)的操作,或是对数据文件的操作进行通信。翻译单元可以被独立翻译,然后稍后被连接来产生一个可执行程序。

5.1.1.2 翻译阶段

1、在翻译的语法规则之前的操作由以下阶段指定[注:实现应该将其行为视作为这些各个阶段都发生,即使其中很多在实践上会被合拢在一起。源文件、翻译单元以及已被翻译的翻译单元不需要以文件方式被存储,也不需要在这些实体与任一外部表示之间有任何一对一的相应关系。本描述仅仅是概念上的,并且并不指定任一特定实现。]

1. 物理源文件多字节字符以一个实现自定义的方式被映射到源字符集(对于行结束指示符引入换行字符),如果有必要的话。三字符序列被相应单字符的内部表示所取代。

2. 所有紧挨在一个换行字符之前的一个倒斜杠字符(\)都会被删除,将物理源行粘接起来形成逻辑源行。只有在任一物理源行最后的倒斜杠才有资格成为这么一个粘接部分。一个不空的源文件应该以一个换行符结尾,并且在此换行符前不应该出现倒斜杠。

3. 源文件被分解为若干预处理符记(token)[注:正如在6.4小节中描述的,将一个源文件的字符划分为若干预处理符记的过程是依赖上下文的。比如,见在一个#include预处理指示符内的<的处理]以及空白字符(包括注释)序列。一个源文件不应该以部分预处理符记或在一个部分注释中结束。每个注释用一个空格字符取代。换行字符被保留。每个除了换行之外的其它空白字符的非空序列是否被保留,还是用一个空格字符代替,由实现定义。

4. 预处理指示符被执行,宏调用被扩展,并且_Pragma单目操作符表达式被执行。如果一个字符序列匹配一个通用字符名的语法,它通过符记连接产生(6.10.3.3),那么该行为是为定义的。一个#include预处理指示符使得命名头文件或源文件从阶段1到阶段4递归处理。随后所有预处理指示符被删除。

5. 在字符常量以及字符串字面量[译者注:字面量定义请见:http://baike.baidu.com/link?url=3AhwRNJT4qo8OvAG1rKlzugWvUR2D3vTb0_eKQI-OOpPbND9mvS19qf_n_kz7DB92l6zLAoMmfspeJY9gSHBKK]中的每个源字符集成员和转义序列都被转换为执行字符集中相应的成员;如果没有相应的成员,那么它被转换为由实现自定义的一个非空(宽)字符成员。[注:一个实现不需要将所有非相应源字符转换为同一个执行字符。]

6. 相邻的字符串字面量符记被拼接。

7. 分隔符记的空白字符不再重要。每个预处理符记被转换为一个符记。转换后的符记在语法上以及语义上进行分析,然后作为一个翻译单元被翻译。

8. 所有外部对象以及函数引用被解决。库部分被连接以满足对没定义在当前翻译单元中的函数与对象的外部引用。所有这样的翻译输出被合成一个程序镜像,它含有在其执行环境中执行所需要的信息。

5.1.1.3 诊断

1、如果一个预处理翻译单元或翻译单元含有任一对语法规则或强制规定的违背,那么一个顺应标准的实现应该至少产生一个诊断消息(以一个实现定义的方式所标识),即使该行为也被显式地指定为未定义或实现定义的。诊断消息不需要在其它情况下产生。[注:此目的为,一个实现应该标识每个违反行为的本质以及可能位置发生在哪里。当然,一个实现不需要产生诊断信息,只要一个有效程序仍然被正确翻译。这也可以成功地翻译一个无效程序。]

2、例:一个实现应该为以下翻译单元发布一个诊断信息:

char i;
int i;

因为在这些情况下,在本国际标准中对一个构造为一个强制规定错误以及导致一个未定义行为所描述的行为,此强制规定错误应该被诊断。

ISO/IEC 9899:2011 条款5——5.1.1 翻译环境的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. ISO/IEC 9899:2011 条款4——标准顺从

    4. 标准顺从 1.在本国际标准中,“应该”被解释为对一个实现或一个程序的要求:相反地,“不该”被解释为禁用. 2.如果违反了出现在一个强制规定或运行时强制规定之外的“应该”或“不该”要求,那么该行为 ...

  7. ISO/IEC 9899:2011 条款6——语言

    6 语言 6.1 标记法 1.在本条款中所使用的语法标记法.语义类别(非终结符)用斜体字指示,而字面量单词以及字符集成员(终结符)用粗体字指示.跟在一个非终结符后面的冒号(:)引出其定义.在单独的行中 ...

  8. ISO/IEC 9899:2011 条款6.3——转换

    6.3 转换 1.有些操作符将操作数的值自动地从一种类型转换为另一种.本子条款指定了从这么一个隐式转换所要求的结果,以及从一个投射操作(一个显式转换)所要求的结果.在6.3.1.8中所列出的信息概括了 ...

  9. ISO/IEC 9899:2011 条款6.5——表达式

    6.5 表达式 1.一个表达式是操作符与操作数的一个序列,这些操作符与操作数指定了一个值的计算,或指派一个对象或一个函数,或是生成副作用,或执行上述操作的组合.对一个操作符的操作数的值计算顺序排在对该 ...

随机推荐

  1. 【OF框架】在Visual Studio中发布Docker镜像,推送镜像到Azure容器注册表

    准备 拥有Azure账号,已经创建 Azure容器注册表,获得注册表地址.账号.密码 本地已经在Visual Studio登录Azure账号. 本地已经拥有Docker环境 注意:首次发布Docker ...

  2. RxJava 以及 Android 中的通用线程解决方案、并发与线程安全

    关于RxJava如今是熟到发紫了,所以对于它底层的动作机制的了解是迫在眉睫了,费话不多说,直接开始. 这里还是以之前获取个人github仓库列表为例,用retrofit+rxjava,也是实际项目中用 ...

  3. 接口调优——WebAPI 过滤器,IIS WebDAV

    目录 1.身份认证过滤器—AuthenticationFilter 2.Action 过滤器—ActionFilter 3.异常处理过滤器—ExceptionFilterAttribute 4.IS ...

  4. 大数据之路week06--day01(Xshell和Xftp的下载与安装、配置JDK)

    上一节,介绍了VMware的下载与安装.安装CentOS 在企业中,我们大多数是不会有界面化操作的,领导也不会直接给你账户的,我们需要自己从外部链接到Linux系统进行操作,对Linux系统的操作都在 ...

  5. windows下递归删除指定文件和文件夹

    //删除文件del *.后缀 /s//删除文件夹for /r 目录 %a in (文件夹名\) do @if exist "%a" rd /s/q "%a"

  6. IAR平台移植TI OSAL到STC8A8K64S4A12单片机中

    玩过TI 的ZigBee或者BLE的人,都会接触到OSAL.OSAL是什么?OSAL英文全称:operating system abstraction layer(操作系统抽象层).基于OSAL的调度 ...

  7. Java中CAS-ABA的问题解决方案

    忻州SEO摘要 CAS即对比交换,它在保证数据原子性的前提下尽可能的减少了锁的使用,很多编程语言或者系统实现上都大量的使用了CAS.   了解CAS(Compare-And-Swap) CAS即对比交 ...

  8. 02-Elenment 引入使用

    快速上手 本节将介绍如何在项目中使用 Element. ¶使用 vue-cli@3 我们为新版的 vue-cli 准备了相应的 Element 插件,你可以用它们快速地搭建一个基于 Element 的 ...

  9. 41、扩展原理-ApplicationListener用法

    41.扩展原理-ApplicationListener用法 ApplicationListener 监听容器中发布的事件.事件驱动模型开发: public interface ApplicationL ...

  10. [TJOI2015]弦论(第k小子串)

    题意: 对于一个给定的长度为n的字符串,求出它的第k小子串. 有参数t,t为0则表示不同位置的相同子串算作一个,t为1则表示不同位置的相同子串算作多个. 题解: 首先,因为t的原因,后缀数组较难实现, ...