您的位置:首页 > 编程语言 > C语言/C++

C语言external-internal-none链接属性浅析

2017-02-10 15:31 369 查看
很多C语言初学者对C语言的链接属性不是很清楚,通过自己的学习将C语言的链接属性浅析总结如下:


工具/原料

GNU-gcc


方法/步骤

㈠. external和internal以及none链接属性的讲解

备注:1.链接属性分为external,internal,none。

2.全局变量默认拥有external链接属性;

static修饰的变量拥有internal链接属性;

函数体中的变量用于none链接属性。

3.拥有external链接属性的变量可被所有文件访问,只需要声明下即可(extern int b;)

拥有internal属性的变量只能在其定义的文件中被访问(static int sta_c;)

拥有none属性的变量只能在其定义开始处到代码块作用域结束处被访问。

4.给已经定义的变量添加任何链接属性声明(如:extern或static)都是无效的,变量原链接属性保持不变。

用代码说明:

///////////////////////myfun.c文件///////////////////////////////

int b = 123; ①

int out_c = 315;

static double PI= 3.14159; //myfun.c文件以外的文件是不能访问PI变量的

int Add(const int first, const int second)

{

return first + second;

}

//End myfun.c file

/////////////////////////test.c 文件///////////////////////////////////////

#include ..

int b;② //等价于extern int b;即定义在myfun.c中的变量b

//最好写成extern int b;易于理解,这种简写模式只适用于全局作用域

//对于函数作用域是不能简写的,否则成了定义函数的局部变量。

int main(void)

{

extern int b;③ //external(外部链接)属性的b,其作用域起于此声明处止于语句④之前

printf("%d\n",b); //输出:123

//函数的局部变量,链接属性为none;④处的变量b会屏蔽掉③处的变量b,

int b = 456; ④

//④处变量b的作用域起于其定义处,止于函数结束

printf("%d",b); //输出: 456

extern int b;⑤

//编译器将extern int b解析成:在已经定义的int b = 456 (④)基础

//上加了一个extern属性。C规定:在已经定义变量上加任何链接属性都不

//会改变变量的原链接属性。给b上加extern属性并不会使none链接属性变

//成extern链接属性。

printf("%d",b); //所以输出: 456

extern int out_c;//绝对不能简写成int out_c;否则是定义函数作用域的变量

printf("%d",out_c); //输出:315

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息