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. Pyspark读取csv文件

    #_*_coding:utf-8_*_ # spark读取csv文件 #指定schema: schema = StructType([ # true代表不为null StructField(" ...

  2. springboot中的小技巧

    1.Thymeleaf 在时使用Thymeleaf的时候不用设置html标签:在默认的Thymeleaf的页面中,对于.html的要求比较严格,少写或者多写标签,都会被报错,而在springboot ...

  3. 20.Vue中获取DOM元素和组件

    1.获取DOM元素和组件:this.$refs

  4. 【转】java注解处理器——在编译期修改语法树

    https://blog.csdn.net/a_zhenzhen/article/details/86065063 前言从需求说起由于相关政策,最近公司安全部要求各系统在rpc接口调用的交互过程中把相 ...

  5. Linux网络编程综合运用之MiniFtp实现(六)

    间隔了一周时间没写了,由于今年的股势行情貌似不错的样子,对于对股市完全不懂的我也在蠢蠢欲动,所以最近一周业余时间在“不务正业”-----学习炒股.发现学习它其实挺费神的,满脑子都是走势图,而且是神经有 ...

  6. tinylogin-1.4

    tinylogin-1.4是一个开发嵌入式的文件系统很好的一个工具

  7. XAMPP启动Apache服务时启动失败

    9:48:49 [Apache] Apache Service detected with wrong path 9:48:49 [Apache] Change XAMPP Apache and Co ...

  8. npm link的使用

    npm link的使用 https://www.jianshu.com/p/aaa7db89a5b2

  9. 04-Dockerfile介绍与使用

    什么是dockerfileDockerfile是由一系列命令和参数构成的脚本,这些命令用一基础镜像并最终创建一个新的镜像.1.对于开发人员:可以为开发团队提供一个完全一致的开发环境.2.对于测试人员: ...

  10. javascript动态合并表格相同的单元格

    <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...