6.9.2 外部对象定义

语义

1、如果对一个对象的标识符的声明具有文件作用域以及一个初始化器,那么该声明是对该标识符的一个外部定义。

2、对于具有文件作用域且没有一个初始化器、没有一个存储类说明符,或者具有存储类说明符static的对象的标识符的一个声明,构成了一个试验性的定义。如果一个翻译单元对于一个标识符包含了一个或多个试验性的定义,并且该翻译单元不包含对此标识符的外部定义,那么该行为就完全好比该翻译单元包含了对此标识符的一个文件作用域的声明,具有到此翻译单元末尾的复合类型,并且具有一个等于0的初始化器。

3、如果对一个对象的一个标识符的声明是一个试验性的定义,并且具有内部连接,那么所声明的类型不应该是一个不完整类型。

4、例1

int i1 = ;    // 定义,外部连接
static int i2 = ; // 定义,内部连接
extern int i3 = ; // 定义,外部连接
int i4; // 试验性定义,外部连接
static int i5; // 试验性定义,内部连接 int i1; // 有效的试验性定义,引用之前的i1
int i2; // 由6.2.2所描述的未定义行为,连接不一致
int i3; // 有效的试验性定义,引用之前的i3
int i4; // 有效的试验性定义,引用之前的i4
int i5; // 由6.2.2所描述的未定义行为,连接不一致 extern int i1; // 引用之前的i1,其连接是外部连接
extern int i2; // 引用之前的i2,其连接是内部连接
extern int i3; // 引用之前的i3,其连接是外部连接
extern int i4; // 引用之前的i4,其连接是外部连接
extern int i5; // 引用之前的i5,其连接是内部连接

5、例2 如果在翻译单元的末尾包含

int i[];

数组i仍然具有不完整类型,那么隐式的初始化器使得它具有一个元素[译者注:相当于定义了int i[1];],它在程序启动时被设置为零。

最新文章

  1. kmdjs api reference
  2. leetcode 419
  3. java树形目录展示
  4. docker基础
  5. 旅行家的预算 1999年NOIP全国联赛普及组NOIP全国联赛提高组
  6. 为什么心跳包(HeartBeat)是必须的?
  7. ReSharper 卸载后 VS2012 没有提示问题
  8. Android 主题和选择器
  9. PHP之SQL防注入代码集合(建站常用)
  10. ModelMap和ModelAndView
  11. iOS开发——Swift篇&单例的实现
  12. #291 div.2
  13. 本博客css style
  14. supesite 模板相关文档记录
  15. web —— jsp笔记
  16. IP校验和
  17. Android做法说明(3)---Fragment使用app袋或v4包解析
  18. 虚拟机安装麒麟3.2时报unkown filesystem,you need to load the linux kernel first
  19. WebService第二天
  20. Mac关机时处于黑屏状态

热门文章

  1. jmeter源码环境(IDEA)
  2. src挖掘过程之信息收集
  3. ViCANdo新版本发布(PART1) | 点云库(PCL)集成
  4. 关于立即调用的函数表达式(IIFE)
  5. python2和python3切换
  6. 牛客1024B 石头游戏
  7. django 项目需要注意的一些点
  8. 【CLAA系列】CLAA 通讯过程
  9. 实用Golang库
  10. 使用eclipse-hadoop插件无法再eclipse操作(上传、删除文件)