zoukankan      html  css  js  c++  java
  • c语言3种链接属性: 外部(external), 内部(internal),无设置(none)

     c语言中,多个文件组合的时候,有可能标示名相同,那么这个时候编译器如何判别的呢?
        c语言中有3种链接属性: 外部(external), 内部(internal),无设置(none)
        外部(external): 使用extern关键字
        内部(internal):  使用static关键字
       

    小结一下:

    1.extern的修饰中在工程必须要有一个变量的定义,否则不能能使用。

    2.extern使用之后可是实现全部工程的不同文件使用相同的变量

    3.internal的属性方式,通过static来进行修饰仅仅是在改文件中可以使用,但是在其他的文件中则不能访问。

     

     


        对各种情况进行一些测试吧
     第一步测试,在两个文件中定义相同名称的变量
        unit1.c
        --------------------
    int a = 10;
    void printtest1()
    {
     printf("print test at %s, variable a = %d/n", __FILE__, a);
    }

        unit2.c
     -------------------
    int a = 20;
    void printtest2()
    {
     printf("print test at %s, variable a = %d/n", __FILE__, a);
    }

        main.c
     ------------------
    void printtest1();
    void printtest1();
    int main(int argc, char *argv[])
    {
     printtest1();
     printtest2();
     system("PAUSE"); 
     return 0;
    }
       编译时提示错误 unit2.c multiple definition of 'a' ,由于unit1.c和unit2.c都定义了a
       第一步测试结论:如果在不同的文件中定义相同名字的变量,编译器无法通过编译
       
       第二步测试,把其中一个声明改成extern 
       这个时候把unit2.c改造一下
    extern int a;
    void printtest2()
    {
     printf("print test at %s, variable a = %d/n", __FILE__, a);
    }
       unit2中使用extern标示该变量是外部链接的, 这样编译通过了,结果显示unit1和unit2中a的值都为10,OK,值相同了,那么真的是同一个变量了吗,修改一下值再确认一下
       改造一下main.c,修改a的值
    extern int a;
    a = 20;
    printtest1();
    printtest2();
    a = 30;
    printtest1();
    printtest2();
     这个时候输出为
     unit1.c   20
     unit2.c   20
     unit1.c   30
     unit2.c   30
     可以确认的确是使用了同一个变量了。
     第二步测试结论;使用extern可以访问其他文件中定义的变量
     
     第三步测试把其中一个声明使用static标示
     首先在unit1.c这把a声明成static,个时候编译器提示main.c和unit2.c中的a未定义,static把unit1.c中的a定义为文件内部使用范围,unit2.c和main.c中无法访问到该变量。
     把uint2.c中的声明修改成int a;
     这个时候输出为
     unit1.c   10
     unit2.c   20
     unit1.c   10
     unit2.c   30
        OK,结果显示unit1.c中的a和unit2.c中的a互相不影响了。再测试一下,在unit1.c中使用extern int a,看看能不能引用到unit2.c中的变量
    void printtest1()
    {
     extern int a;
     a = 10;
     printf("print test at %s, variable a = %d/n", __FILE__, a);
    }
        这个时候输出为
     unit1.c   10
     unit2.c   20
     unit1.c   10
     unit2.c   30
        可以确认unit1.c中使用的a都是本文件内定义的变量,无法影响到unit2.c中的变量了。
     第三步测试结论:使用static标示的变量在文件内部有效,其他文件中无法访问。并且在该文件中无法引用到其他文件的同名称变量
     
     第四步测试,两个文件都设置成extern
     如果在unit1.c和unit2.c中都申明成extern会怎么样呢?
        unit1.c
        --------------------
    extern int a;
    void printtest1()
    {
     printf("print test at %s, variable a = %d/n", __FILE__, a);
    }

        unit2.c
     -------------------
    exntern int a;
    void printtest2()
    {
     printf("print test at %s, variable a = %d/n", __FILE__, a);
    }
     这个时候所有使用a的地方都报编译错误,提示没有定义变量。
     第四步测试结论:使用extern标示的变量必须已经定义过。
     
     第五步,测试static标示的函数
     把unit1.c中的printtest1修改成static
     static void printtest1()
     这时编译器报错,main.c中使用的printtest1未定义。
     第5步测试结论:使用static标示的函数,在其他文件中不能访问。
     

    原文传送门:请点击

  • 相关阅读:
    打包下载,byte[] ,
    .net mvc 异常处理 IExceptionFilter,保存请求参数
    c# webapi websocket 服务端消息发送
    mailkit用163发邮件
    使用OPCAutomation实现对OPC数据的访问,“对 COM 组件的调用返回了错误 HRESULT E_FAIL”错误
    .net core 获取客户端ip
    C#读取OPC server
    Makedown语言常用语法
    ops:Rsync和Scp区别
    ops:Linux /bin,/sbin,/usr/sbin, /usr/local/bin区别
  • 原文地址:https://www.cnblogs.com/mlgjb/p/8665806.html
Copyright © 2011-2022 走看看