C语言中的链接类型
C语言中的链接类型:在上一篇博客中,讲到了C的存储类型,存储类型的关键字是auto,static,extern,和register而在本篇幅中,同样我们也会用到auto,static,extern,但是本篇幅中的这几个关键字不仅仅将用来修饰变量,同样也可以用来修饰函数,在修饰函数的时候,他们将会有不同的意义,当然也会对其修饰变量会有一个更深的理解
什么叫链接属性,
在C语言的编译过程中有一个步骤叫做链接,链接的作用就是将外部的函数库通过链接形式,变成二进制的可执行文件,那么,就是不同文件之间的关系。而这里的链接其中的一个含义就是函数或者变量在不同文件中是怎么相互调用的;
下面讲一下C语言中几种链接类型:
外部链接extern
允许外部文件调用非本文件的函数或者变量,或者在本文件中,函数执行在定义之前的时候,使用extern进行提前声明的话,编译时候不会报错———–>类似java中的public
内部链接static
用static修饰的变量或者函数的链接属性为其作用领域只能仅限在本文件中 ,在其他文件中就不能进行调用,不同文件中的内部函数是不会相互干扰的——–>类似java中的private
None
使用auto进行定义的变量,其作用域仅限在当前的函数中,夸函数则不能够进行调用
External代码使用
/**
*extern1使用
*/
#include int main(void){ extern int a,b;//定义在使用之前,那么这个时候需要用extern来修饰。表示链接 printf("plus:%d\n",a,b); return 0; } int a = 10,b = 20;
/**
*extern2使用
*/
头文件
#ifndefine __EXTERNAL_DEMO_H_ #define __EXTERNAL_DEMO_H //在头文件声明的时候用extern来修饰 external int add(int a,int b); #endif
实现文件external_demo.c
#include "external_h.h" //在文件内部进行使用,外部文件不能访问 static int num = 20; //用于外部文件调用,用extern来修饰 extern int add(int a, int b){ return a+b; }
测试文件:
#include int main(void){ int a = 20; int b = 30; printf("plus:%d\n"add(a,b)); return 0; }
Internal链接属性
头文件
#ifndef __STATIC_DEMO_H_ #define __STATIC_DEMO_H_ int add(int a, int b); #endif
#include "staticDemo.h" #include //静态static修饰的函数声明,只能在staticDemo中去使用 static void out_result(int); //静态static修饰的变量,只能在本文件中使用,外部文件无法访问 static int num = 50; //缺省默认是extern修饰的,外部是可以进行访问的 int add(int a,int b){ int plus = a + b; out_result(plus); return plus; } static void out_result(int result){ printf("out_result:%d\n",result); }
#include #include"staticDemo.h" int main(void){ int num1 = 10; int num2 = 20; add(num1,num2); return 0; }
总结一下:
用extern来修饰的函数或者变量,外部文件可以调用或访问。
用static修饰的函数,只能在本文件内部进行使用,外部不能访问
使用auto修饰的变量只能本函数内部进行使用,外部不能调用或者访问,修饰函数默认缺省的时候外部文件是可以进行访问调用的、
链接属性的理解对于我们后面将项目分成很多模块是很有帮助的,每个模块之间都是通过链接形式,形成一个大的文件,什么允许外部访问,什么不允许外部进行访问,作为一个程序猿来说,是要有一定辨别能力的