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. 用 Redis 实现延时任务

    原文:https://cloud.tencent.com/developer/article/1358266 1.什么是延时任务 延时任务,顾名思义,就是延迟一段时间后才执行的任务.延时任务的使用还是 ...

  2. 2019-ACM-ICPC-南京区网络赛-D. Robots-DAG图上概率动态规划

    2019-ACM-ICPC-南京区网络赛-D. Robots-DAG图上概率动态规划 [Problem Description] ​ 有向无环图中,有个机器人从\(1\)号节点出发,每天等概率的走到下 ...

  3. php遍历目录与文件夹的多种方法详解

    遍历目录或遍历目录下指定类型的文件,这是每一个童鞋在写程序的时候难免会用到的.PHP本身也提供了很多灰常有用的函数,正确地使用它们,不会有错滴.下面就我个人学习过程中的一些总结,希望对想学PHP的童鞋 ...

  4. Jquery Ajax跨域访问

    一.同源策略 二.跨域的集中方法: 1.服务器端发送请求,服务器作为中继代理(此方法不理解) 2.iframe 3.script标签 通过动过动态生成script标签,并将src指向目标源的方式(im ...

  5. python 高阶函数之filter

    前文说到python高阶函数之map,相信大家对python中的高阶函数有所了解,此次继续分享python中的另一个高阶函数filter. 先看一下filter() 函数签名 >>> ...

  6. MyBatis的关联查询

    关联映射的一对多 //查询经理角色 以及 该角色下对应的员工集合 public SmbmsRole getRoleAndUser(Integer id); <resultMap id=" ...

  7. 测试使用API

    https://api.github.com/users/github 返回值中的某些URL也可以作为测试API使用

  8. 前端利用webuploader实现超大文件分片上传、断点续传

    本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...

  9. QT5 文件读写操作

    QFile Class 1.read读文件 加载文件对象  QFile file("文件地址"); 打开加载的文件file.open(打开方式); 操作文件 关闭打开的文件file ...

  10. 可持久化数据结构(平衡树、trie树、线段树) 总结

    然而好像没有平衡树 还是题解包: T1:森林 树上主席树+启发式合并. 然而好像知道标签就没啥了.在启发式合并时可以顺手求lca 然而这题好像可以时间换空间(回收空间) T2:影魔 难点在于考虑贡献的 ...