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

很多C语言初学者对C语言的链接属性不是很清楚,通过自己的学习将C语言的链接属性浅析总结如下:

工具/原料

  • GNU-gcc

方法/步骤

  1. ㈠. 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)都是无效的,变量原链接属性保持不变。

  2. 用代码说明:

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

    }

猜你喜欢

转载自blog.csdn.net/woshiwangbiao/article/details/54970972