ISO/IEC 9899:2011 条款5——5.1.1 翻译环境
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 翻译环境的更多相关文章
- ISO/IEC 9899:2011 条款5——5.1.2 执行环境
5.1.2 执行环境 1.定义了两个执行环境:独立式(freestanding)以及宿主的(hosted).在这两种情况下,当一个派定的C函数被执行环境调用时,程序就启动.所有具有静态存储周期的对象应 ...
- ISO/IEC 9899:2011 条款3——术语、定义与符号
3. 术语.定义与符号 1.对于此国际标准的意图,应用了以下定义.其它术语是在用斜体类型或一个语法规则左侧出现的地方定义.在本国际标准中所显式定义的术语不被假定为对其它地方所定义的类似术语的隐式引用. ...
- ISO/IEC 9899:2011 条款5——5.2.1 字符集
5.2.1 字符集 1.两个字符集和它们相关联的依次顺序应该被定义:写在源文件中的集合(源字符集),以及在执行环境中被解释的集合(执行字符集).每个集合此外被划分为一个基本字符集,其内容由本子条款给出 ...
- ISO/IEC 9899:2011 条款6.4.2——标识符
6.4.2 标识符 6.4.2.1 通用 语法 1.identifier: identifier-nodigit identifier identifier-nondigit identifie ...
- ISO/IEC 9899:2011 条款6.4.3——通用字符名
6.4.3 通用字符名 语法 1.通用字符名: universal_character-name: \u hex-quad(四位十六进制数) \U hex-quad hex-quad hex-quad ...
- ISO/IEC 9899:2011 条款4——标准顺从
4. 标准顺从 1.在本国际标准中,“应该”被解释为对一个实现或一个程序的要求:相反地,“不该”被解释为禁用. 2.如果违反了出现在一个强制规定或运行时强制规定之外的“应该”或“不该”要求,那么该行为 ...
- ISO/IEC 9899:2011 条款6——语言
6 语言 6.1 标记法 1.在本条款中所使用的语法标记法.语义类别(非终结符)用斜体字指示,而字面量单词以及字符集成员(终结符)用粗体字指示.跟在一个非终结符后面的冒号(:)引出其定义.在单独的行中 ...
- ISO/IEC 9899:2011 条款6.3——转换
6.3 转换 1.有些操作符将操作数的值自动地从一种类型转换为另一种.本子条款指定了从这么一个隐式转换所要求的结果,以及从一个投射操作(一个显式转换)所要求的结果.在6.3.1.8中所列出的信息概括了 ...
- ISO/IEC 9899:2011 条款6.5——表达式
6.5 表达式 1.一个表达式是操作符与操作数的一个序列,这些操作符与操作数指定了一个值的计算,或指派一个对象或一个函数,或是生成副作用,或执行上述操作的组合.对一个操作符的操作数的值计算顺序排在对该 ...
随机推荐
- (转)大厂常问到的14个Java面试题
1. synchronized和reentrantlock异同 相同点 都实现了多线程同步和内存可见性语义 都是可重入锁 不同点 实现机制不同 synchronized通过java对象头锁标记和Mon ...
- python_面向对象——封装
1.私有属性 class Person(object): def __init__(self,name,age): self.name = name self.age = age #实例属性 self ...
- Mysql-Percona mysql5.7简单安装
Mysql-Percona mysql5.7简单安装 一.什么是Percona 单从mysql的角度来讲,可以把Percona理解为mysql的一个分支,因为mysql的源码是开源的,Percona就 ...
- 基于 CSS 的 Web 框架 CJSS
CJSS 是一个基于 CSS 的 Web 框架,所有效果都在 CSS 文件中生效,可以在 CSS 中使用它添加更多功能,或者构建一个完整的页面. 使用方法: HTML 想要使用某个组件,在 CSS 文 ...
- kombu在redis中的键值名
参考flower源码 取队列名,发送到求数量的函数中 queue_names = ControlHandler.get_active_queue_names() queues = yield brok ...
- 2019HDU多校第7场——构造
题意 假设现在你在准备考试,明天的考试有 $n$ 道题目,对于分值为 $i$ 的题目至少复习 $i+1$ 小时才能做对,已知总分为$m$,求确保完成 $k$ 道题的最少时间. 分析 手动尝试一下,发现 ...
- python AES对称加密
1.首先需要安装第三方库 pip install pycryptodome 2.实例代码,亲测可用 # coding:utf-8 import base64 from Crypto.Cipher im ...
- linux 忘记root密码怎么处理。
这个是不少人纠结的地方.一台服务器,太久没使用,然后又没有一个文件txt,excel记录那些密码相关的东西.所以导致很多信息忘记了. 参考文章:https://blog.csdn.net/cranky ...
- Nginx设置禁止通过IP访问服务器并且只能通过指定域名访问
为了避免别人把未备案的域名解析到自己的服务器IP而导致服务器被断网,需要在nginx上设置禁止通过IP访问服务器,只能通过域名访问. 最关键的一点是,在server的设置里面添加这么一行: liste ...
- VS下字符串与数组互相装换
1.分割字符串IdStr为int数组Ids int[] Ids = Array.ConvertAll<string, int>(IdStr.Trim().Split(','), deleg ...