ISO/IEC 9899:2011 条款6.2.2——标识符的连接
6.2.2 标识符的连接
1、在不同作用域中声明的一个标识符或在同一作用域多次出现的一个标识符可以被用作对同一个对象或函数的引用,通过一个称为连接的过程。[注:在两个不同的标识符之间没有连接。]有三种类型的连接:外部连接,内部连接,无连接。
2、在构成一整个程序的翻译单元和库集合中,带有外部链接的一个特定的标识符的每个声明指示了同一个对象或函数。在一个翻译单元内,带有内部连接的一个标识符的声明指示了同一个对象或函数。不带有连接的一个标识符的每个声明指示了一个唯一的实体。
3、如果一个对象或一个函数的一个文件作用域的标识符包含存储类说明符static,那么该标识符具有内部连接。[注:一个函数声明只有当它在文件作用域时才可以包含存储类说明符static;见6.7.1]
4、对于用存储类说明符extern所声明的一个标识符,在某一作用域中该标识符的之前的声明可见,[注:在6.2.1中指出,后面的声明可能隐藏之前的声明。]如果之前的声明指定了内部或外部连接,那么在之后声明的该标识符的连接具有与之前声明所指定的相同的连接。如果之前没有声明可见,或者如果之前的声明没有指定连接,那么标识符具有外部连接。[译者注:
static int a; // 声明为static存储类别 extern int a; // 由于之前声明的存储类为static,所以这里的a具有static存储类别 int main(void)
{
printf("a = %d\n", a); return ;
} static int a = ; // 这里对a进行定义并初始化
代码示例2:
extern int a; // 上面没有对a的声明 int main(void)
{
printf("a = %d\n", a); return ;
} static int a = ; // ERROR! 之前声明的a为外部连接存储类别,与static存储类别冲突 int a = ; // OK!a具有外部存储类别
]
5、如果对一个函数的标识符的声明没有存储类别说明符,那么其连接完全被确定为它是由extern存储类别说明符来声明的。如果对一个对象的标识符的声明具有文件作用域,并且没有存储类别说明符,那么其连接是外部的。
6、以下标识符不具有连接:一个被声明为一个对象或一个函数以外的任何东西;一个被声明为一个函数参数的标识符;用于声明一个对象,而此对象不具有存储类标识符extern的一个语句块作用域。
7、如果在一个翻译单元内,同一个标识符既以内部连接的形式出现,又以外部连接的形式出现,那么行为是未定义的。
最新文章
- PHP之static静态变量详解(一)
- 手动编译安装docker环境,以及偶尔出现的bug
- @Autowired失效
- HTML5-Video &; Audio
- Android环境rm命令
- Windows平台字符的存储和输出分析
- Directx11学习笔记【十】 画一个简单的三角形
- nodejs基础教程回顾01
- Mahout kmeans聚类
- C# 10分钟完成百度人脸识别——入门篇
- C#-方法(八)
- 八、.net core 通过数据库配置文件连接操作数据库
- MyBatis-Plus工具快速入门
- [51nod1514] 美妙的序列
- SQL中on条件与where条件的区别
- SeaJS入门教程系列之SeaJS介绍(一)
- FastAdmin 生产环境升级注意
- Structs复习 OGNL
- 如何移除EFI system partition?
- .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件