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. 动态规划——python

    1.爬楼梯问题一个人爬楼梯,每次只能爬1个或两个台阶,假设有n个台阶,那么这个人有多少种不同的爬楼梯方法 动态规划的状态转移:第 i 个状态的方案数和第 i-1, i-2时候的状态有关,即:dp[i] ...

  2. psql主主复制

    主主是mysql的概念,通常在mysql中为保证事务一致也是一台主写,一台做读.pg主从可以互为切换 之前没做数据库部署这部分,一个同事离职暂时没人,接受过来的!mysql做的是主主复制,我理解是可以 ...

  3. 快捷键和功能键、进入DOS命令行的方法、DOS命令讲解、java跨平台原理、JRE和JDK的定义、书写格式

    快捷键和功能键A:键盘功能键* a:Tab* b:Shift* c:Ctrl* d:Alt* e:空格 * f:Enter* g:Window* h:上下左右键* i:PrtSc(PrintScree ...

  4. Appium自动化测试教程-自学网-monkey自定义脚本实践

    自定义脚本的稳定性测试 常规Monkey测试执行的是随机的事件流,但如果只是想让Monkey测试某个特定场景这时候就需要用到自定义脚本了,Monkey支持执行用户自定义脚本的测试,用户只需要按照Mon ...

  5. HTML 005 段落

    HTML 段落 HTML 可以将文档分割为若干段落. HTML 段落 段落是通过 <p> 标签定义的. 实例 <p>这是一个段落 </p> <p>这是另 ...

  6. log4j2配置文件log4j2.xml详解

    配置全解 1.缺省默认配置文件 <?xml version="1.0" encoding="UTF-8"?> <Configuration s ...

  7. PowerDesigner创建表 拷贝创建表语句 SQLSERVER创建数据库 使用查询 创建表 并且添加数据

    PowerDesigner创建表 : 1.双击打开PowerDesigner   2.双击打开Create model 3左键点击Model  types,再点击Physical    Data  m ...

  8. bzoj 1396/2865: 识别子串 后缀自动机+线段树

    水水的字符串题 ~ #include <map> #include <cstdio> #include <cstring> #include <algorit ...

  9. python 最小二乘 leastsq 函数实现

    代码修改自 http://www.cnblogs.com/NanShan2016/p/5493429.html 网上百度了一下,主要是两个例子,一个利用了多项式函数,一个就是这个.有些细节没看懂,主要 ...

  10. GB∕T 35658平台过检 已通过最新的部标JT/T 808-2019, JT/T 809-2019标准检测

    2019年交通部GPS平台检测标准发生了重大变化, 原来的796平台功能标准, 变更为GB/T35658标准, 这个标准其实2017年就公布了, 实际上还是796标准, 但是检测项目,以前是可选的, ...