详解C语言external-internal-none链接属性
2015-06-25 08:58
204 查看
external(外部) 这种链接属性的标识符无论声明多少次,位于几个源文件都表示一个实体。例如下面的代码:
文件名为main.c
文件名为test.c
文件名为var.c
在缺省情况下,标识符studentid的链接属性为external,如果像这样声明,编译器在编译的时候将会报错(multiple definition of ‘studentid’)。var.c中的studentid由于加上了extern关键字,那么它访问的就是其它源文件声明的外部变量了。
internal(内部) 这种链接属性的标识符在同一个源文件内的所有声明中都指同一个实体,但位于不同源文件的多个声明则分属不同的实体。例如下面的代码:
文件名为main.c
文件名为test.c
在缺省情况下,标识符studentid的链接属性为external,但是,加上static关键字以后,studentid的链接属性就变为了internal, 像这样声明没有任何问题。test.c文件中test函数中的studentid虽然有extern关键字,但是它并不会更改由第一次声明所指定和链接属性。也就是说它使用的是上面声明的static的那个变量。
none(无) 这种链接属性的标识符总是被当作单独的个体。例如下面的代码:
文件名为main.c
文件名为test.c
studentid的链接属性为none
总结:
1. static关键字只对缺省链接属性为external的声明才有改变链接属性的效果。
2. extern关键字用于第一次声明时,它可以改变其链接属性,但是第2次或以后的声明将不会起作用。
3.凡是在任何代码块之外声明的变量其缺省链接属性为external,加上static关键字以后就将其链接属性改为internal,在函数内部或者代码块内部的声明其链接属性为none,加上extern关键字以后就可以引用外部文件定义的具有external链接属性的声明了。
文件名为main.c
#include <stdio.h> int studentid;
文件名为test.c
#include <stdio.h> int studentid;
文件名为var.c
#include <stdio.h> int var() { extern int studentid; }
在缺省情况下,标识符studentid的链接属性为external,如果像这样声明,编译器在编译的时候将会报错(multiple definition of ‘studentid’)。var.c中的studentid由于加上了extern关键字,那么它访问的就是其它源文件声明的外部变量了。
internal(内部) 这种链接属性的标识符在同一个源文件内的所有声明中都指同一个实体,但位于不同源文件的多个声明则分属不同的实体。例如下面的代码:
文件名为main.c
#include <stdio.h> static int studentid;
文件名为test.c
#include <stdio.h> static int studentid;
void test() {
extern int studentid;
}
在缺省情况下,标识符studentid的链接属性为external,但是,加上static关键字以后,studentid的链接属性就变为了internal, 像这样声明没有任何问题。test.c文件中test函数中的studentid虽然有extern关键字,但是它并不会更改由第一次声明所指定和链接属性。也就是说它使用的是上面声明的static的那个变量。
none(无) 这种链接属性的标识符总是被当作单独的个体。例如下面的代码:
文件名为main.c
#include <stdio.h> int main() { int studentid; }
文件名为test.c
#include <stdio.h> int test() { int studentid; }
studentid的链接属性为none
总结:
1. static关键字只对缺省链接属性为external的声明才有改变链接属性的效果。
2. extern关键字用于第一次声明时,它可以改变其链接属性,但是第2次或以后的声明将不会起作用。
3.凡是在任何代码块之外声明的变量其缺省链接属性为external,加上static关键字以后就将其链接属性改为internal,在函数内部或者代码块内部的声明其链接属性为none,加上extern关键字以后就可以引用外部文件定义的具有external链接属性的声明了。
相关文章推荐
- C#虚方法的声明和使用实例教程
- Lua和C语言的交互详解
- 提示出现unresolved external symbol _main的解决方法
- 关于C语言中参数的传值问题
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言内存对齐实例详解
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- 探讨C语言的那些小秘密之断言
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言泛型编程实例教程
- C语言中使用lex统计文本文件字符数
- 基于C语言fflush()函数的使用详解
- C语言单链队列的表示与实现实例详解
- 关于C语言除0引发的思考
- 深入分析C中不安全的sprintf与strcpy
- Lua教程(四):在Lua中调用C语言、C++的函数
- C语言求幂计算的高效解法
- C语言实现输入一颗二元查找树并将该树转换为它的镜像