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

  1. 当组成一个程序的各个源文件分别被编译之后,所有的目标文件以及那些从一个或多个库文件中引用的函数链接在一起,形成可执行程序。然而,如果相同的标识符出现在几个不同的源文件中时,又该怎么办呢?这时就引入了C语言的链接属性。标识符的链接属性决定如何处理在不同文件中出现的标识符。标识符的作用域与它的链接属性有关,但这两个属性并不相同

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

  3. 知识点:1.链接属性分为external,internal,none。 2.全局变量默认拥有external链接属性;static修饰的变量拥有internal链接属性;函数体中的变量用于none链接属性 。 3.拥有external链接属性的变量可被所有文件访问,只需要声明下即可(extern int b;) 拥有internal属性的变量只能在其定义的文件中被访问(static int sta_c;)拥有none属性的变量只能在其定义开始处到代码块作用域结束处被访问。      4.给已经定义的变量添加任何链接属性声明(如:extern或static)都是无效的,变量原链接属性保持不变。

  4. 用代码说明:Example1

  5. ///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;

    }

  6. Example2:

    Typedef char*a;

    Int b;

    Int c(intd)

    {

    Int e;

    Int f(int g);

    ...

    }

    标识符b、c和f的链接属性为external,其余标识符属性则为none。因此另一个源文件也包含了标识符b的类似声明并调用函数c,他们实际上访问的是这个源文件所定义的实体。F的链接属性之所以是external是因为它是个函数名,在这个源文件中调用函数f,它实际上将连接到其他源文件所定义的函数,甚至这个函数的定义可能出现在某个函数库。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值