C/C++的几种链接属性浅析

18 篇文章 0 订阅
㈠. external和internal以及none链接属性的讲解

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

      2.全局变量默认拥有external链接属性;
        static修饰的变量拥有internal链接属性;
        函数体中的变量用于none链接属性。

      3.拥有external链接属性的变量可被所有文件访问,只需要声明下即可(extern int b;)
        拥有internal属性的变量只能在其定义的文件中被访问(static int sta_c;)
        拥有none属性的变量只能在其定义开始处到代码块作用域结束处被访问。

      4.变量一经定义其链接链接属性就不能被改变。

㈡.变量 定义和声明 的区分

        很多C语言书中对变量的定义和声明区分得不是很清楚,需要“定义一个变量”时通常都写成"声明一个变量",这两个概念区别很大的!我开始学习C语言是也没有区分开来,后来学习C++时看了《C++ primary》这本书后才明白一二,这本书中将“定义变量和声明变量”定性为 --定义变量是需要分配存储空间的,而声明变量不需要分配存储空间;一个变量只能被定义一次,而同样的一个声明可以在一个源文件中的任何(符合变量声明语法的地方)地方声明任意次数

        根据以上的变量声明和定义的定型原则可知:

         在myfun.c文件中:

       int num = 12;   //定义int类型变量 num,默认拥有external属性

       double natural_num = 2.175;    //定义double类型变量 natural_num,默认拥有external属性


         在test.c文件中: 

         int num;      //这是一个声明,其定义在myfun.c文件中,强烈建议使用这种写法 extern int num

          external double natural_num;   //声明natural_num变量,其定义在myfun.c文件中

          float PI = 3.14;  //定义一个变量

         long counter;   //定义一个变量,不是声明一个变量

          现在想起来觉得有些书的确误人子弟,同时也说明了当知识增多时这些错误才能被我们发现,才不至于一直被误导下去。


用代码说明:

///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

    int b = 456; ④  //函数的局部变量,链接属性为none;④处的变量b会屏蔽掉③处的变量b,
	                 //④处变量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;
}

         如果看不清代码中的注释标号,请将浏览器字体调大点(FireFox浏览器按住Ctrl + 鼠标滑轮可以调整页面字体大小),以便阅读代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值