C 链接属性浅析
来源:互联网 发布:3d降噪算法 编辑:程序博客网 时间:2024/05/18 08:15
C 链接属性浅析
链接属性用于处理多个文件中同名标识符是否指向同一实体的问题。C 中有三种链接属性——None,Internal和External。让我们分别看看这三种类型。
- None:表示该标识符没有其他链接,总是独立的。也就是说这些标识符都会指向独立的、不同的实体
- Internal:表示在同一文件中声明的标识符都会指向同一实体,而不同文件中声明的同名标识符则会指向其他实体
- 换言之,它修饰的变量仅能在本文件使用,其他文件无法访问
- External:表示无论在哪声明该标识符,也无论声明多少次,它们都会指向同一实体
- 换言之,它修饰的变量可以引用其他文件中定义的变量
代码分析
看下代码就明白三者的不同了:
None
//FileOne.cvoid foo(){ int var;}//FileTwo.cvoid func(){ int var;}
局部变量就是一个很好的例子。这两个变量虽然同名,但会被独立的处理开来,它们指向的是不同的实体。
Internal
该类型的链接需要static关键字修饰。
//FileOne.cstatic int var = 0x7f;
var只能在FileOne中被使用,其他文件无法访问此变量。也就是说,FileOne中声明的所有var都将指向同一个实体,而其他文件中声明的var将指向不同实体。
External
该类型需要使用extern关键字修饰
//FileOne.cint var = 123;//FileTwo.cextern int var; //TIP : 这是声明语句,而非定义语句。声明语句不会申请新空间,而定义会printf("%d",var); //123
可见FileTwo文件声明的同名标识符var也指向了同FileOne一样的实体。
变量所属链接属性的判别
这里有几个基本的准则:
- 具有代码块作用域或函数原型作用域的变量属于None链接属性
- 如函数中的局部变量
- 全局变量(函数等)默认拥有external链接属性
- 变量一经定义其链接链接属性就不能被改变
对于第二点我们举例说明一下:
//FileOne.cint a = 123;//FileTwo.c#include <stdio.h>#include <stdlib.h>/** * 全局变量默认具有external链接属性,实际上此句话等价于: * extern int a; * */int a;int main(){ printf("%d",a);//123; return EXIT_SUCCESS;}
此外有个特殊的情况需要注意一下:
int main(){ extern int b; int b = 456;}
对于这种同作用域下对同变量施加不同链接属性的情况,在笔者Mac中的Eclipse下无法通过编译,提示“ non-extern declaration of ‘b’ follows extern declaration”。即使这两个语句调换一下也有不可以。笔者后在网上找到了对此情况的说明:
Two declarations of a in the same scope with different linkage give undefined behaviour.
在同作用域中,声明两个具有不同链接属性的变量a将导致未定义行为。
因此应避免这类情况的发生。
0 0
- C 链接属性浅析
- C/C++的几种链接属性浅析
- C语言external-internal-none链接属性浅析
- C语言 三种链接属性(external、internal、none)的浅析
- C 链接属性
- C语言中的链接属性
- Objective-C属性关键字浅析(上)
- Objective-C属性关键字浅析(下)
- C中的链接属性及作用域
- C语言:链接属性与存储类型
- Linux C笔记之 链接属性 详解
- C语言external-internal-none链接属性
- 深入c语言_链接属性
- 链接属性
- 链接属性
- 链接属性
- 链接属性
- 链接属性
- 【转】SQL*Loader 详解
- Jquery获取父窗口中的元素
- Climbing Stairs 带测试版
- 使用Oracle的Job+Procedure实现数据的定时迁移备份
- ubuntu 安装ffmpeg
- C 链接属性浅析
- git merge 和 git rebase 小结
- MySQL多表操作
- Blender 导出obj到 OpenGL
- 二、SpringBoot 配置 Junit Json
- 剑指offer(38):两个链表的第一个公共节点
- Oracle一次执行(插入、更新、删除)多条语句的办法
- hdu 2089 不要62 几种ac的方法
- javascript弹出模态窗口,获取父页面的元素