zoukankan      html  css  js  c++  java
  • c语言之extern和static

    今天用extern突然发现了extern的另一个特点。

    比如,现在operator.c里面有个全局数组变量int arr[5],和三个函数f1,f2,f3.

    #include<stdio.h>
    #define MAX 5
    int arr[MAX]={2,3,4,5,6};
    int sum()
    {
      int i,n;
    n=0;
    for(i=0;i<MAX;i++)
    {
       n+=arr[i];
    }
    return n;
    }
    int get_max()
    {
       int max;int i;
    i=0;
    max=arr[i];
    for(i=0;i<MAX;i++)
    {
       if(arr[i]>max)max=arr[i];
    }
    return max;
    }

    然后在另一个函数main.c里调用他们,

    #include<stdio.h>
    extern int arr[];//第二行

    extern int sum();//第三行

    extern int get_max();//第四行

    extern void print();//第五行
    int main(void)
    {
      int all,max;
    all=sum();
    max=get_max();
    print();
    printf("%d,%d\n",all,max);
    //printf("%d",arr[0]);
    return 0;
    }

    然后gcc operation.c main.c -o main

    要点在第二,第三,第四,第五行,在这里可以去掉第三行、第四行和第五行,但不能去掉第二行,因为函数默认是extern的,而变量不是。

    另外,如果在operation.c里,在函数和变量前面加上static,那么它就不可以在外面被引用了,static没有改变全局变量的声明周期(依然在数据段),但却改变了全局变量的作用范围(变小了),加了static的全局变量只能在本文件中引用!
                 

  • 相关阅读:
    c++ 为自定义类添加stl遍历器风格的遍历方式
    C++ 生成随机数
    c/c++ 函数说明以及技巧总结
    XSLT 教程
    C# 高效过滤DataTable 中重复数据方法
    xml获取指定节点的路径
    TreeView控件
    推荐一些C#相关的网站、资源和书籍
    C#多线程操作
    C#二进制序列化
  • 原文地址:https://www.cnblogs.com/ymy124/p/2292355.html
Copyright © 2011-2022 走看看