• 【转】C语言正确使用extern关键字


      利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数,下面就结合具体的实例,分类说明一下。

    一、引用同一个文件中的变量

     1 #include<stdio.h>
     2 
     3 int func();
     4 
     5 int main()
     6 {
     7     func(); //1
     8     printf("%d",num); //2
     9     return 0;
    10 }
    11 
    12 int num = 3;
    13 
    14 int func()
    15 {
    16     printf("%d
    ",num);
    17 }

      如果按照这个顺序,变量 num在main函数的后边进行声明和初始化的话,那么在main函数中是不能直接引用num这个变量的,因为当编译器编译到这一句话的时候,找不到num这个变量的声明,但是在func函数中是可以正常使用,因为func对num的调用是发生在num的声明和初始化之后。

      如果我不想改变num的声明的位置,但是想在main函数中直接使用num这个变量,怎么办呢?可以使用extern这个关键字。像下面这一段代码,利用extern关键字先声明一下num变量,告诉编译器num这个变量是存在的,但是不是在这之前声明的,你到别的地方找找吧,果然,这样就可以顺利通过编译啦。但是你要是想欺骗编译器也是不行的,比如你声明了extern int num;但是在后面却没有真正的给出num变量的声明,那么编译器去别的地方找了,但是没找到还是不行的。

      下面的程序就是利用extern关键字,使用在后边定义的变量。

     1 #include<stdio.h>
     2 
     3 int func();
     4 
     5 int main()
     6 {
     7     func(); //1
     8     extern int num;
     9     printf("%d",num); //2
    10     return 0;
    11 }
    12 
    13 int num = 3;
    14 
    15 int func()
    16 {
    17     printf("%d
    ",num);
    18 }

    二、引用另一个文件中的变量

      如果extern这个关键字就这点功能,那么这个关键字就显得多余了,因为上边的程序可以通过将num变量在main函数的上边声明,使得在main函数中也可以使用。
    extern这个关键字的真正的作用是引用不在同一个文件中的变量或者函数。

    main.c

    1 #include<stdio.h>
    2 
    3 int main()
    4 {
    5     extern int num;
    6     printf("%d",num);
    7     return 0;
    8 }

    b.c

    1 #include<stdio.h>
    2 
    3 int num = 5;
    4 
    5 void func()
    6 {
    7     printf("fun in a.c");
    8 }

      例如,这里b.c中定义了一个变量num,如果main.c中想要引用这个变量,那么可以使用extern这个关键字,注意这里能成功引用的原因是,num这个关键字在b.c中是一个全局变量,也就是说只有当一个变量是一个全局变量时,extern变量才会起作用,向下面这样是不行的。

    mian.c

    1 #include<stdio.h>
    2 
    3 int main()
    4 {
    5     extern int num;
    6     printf("%d",num);
    7     return 0;
    8 }

    b.c

    1 #include<stdio.h>
    2 
    3 void func()
    4 {
    5     int num = 5;
    6     printf("fun in a.c");
    7 }

      另外,extern关键字只需要指明类型和变量名就行了,不能再重新赋值,初始化需要在原文件所在处进行,如果不进行初始化的话,全局变量会被编译器自动初始化为0。像这种写法是不行的。  

    1 extern int num=4;

      但是在声明之后就可以使用变量名进行修改了,像这样: 

    1 #include<stdio.h>
    2 
    3 int main()
    4 {
    5     extern int num;
    6     num=1;
    7     printf("%d",num);
    8     return 0;
    9 }

      如果不想这个变量被修改可以使用const关键字进行修饰,写法如下:  

    mian.c

    1 #include<stdio.h>
    2 
    3 int main()
    4 {
    5     extern const int num;
    6     printf("%d",num);
    7     return 0;
    8 }

    b.c

    1 #include<stdio.h>
    2 
    3 const int num=5;
    4 void func()
    5 {
    6     printf("fun in a.c");
    7 }

      使用include将另一个文件全部包含进去也可以引用另一个文件中的变量,但是这样做的结果就是,被包含的文件中的所有的变量和方法都可以被这个文件使用,这样就变得不安全,如果只是希望一个文件使用另一个文件中的某个变量还是使用extern关键字更好。

    三、引用另一个文件中的函数

      extern除了引用另一个文件中的变量外,还可以引用另一个文件中的函数,引用方法和引用变量相似。

    mian.c

    1 #include<stdio.h>
    2 
    3 int main()
    4 {
    5     extern void func();
    6     func();
    7     return 0;
    8 }

    b.c

    1 #include<stdio.h>
    2 
    3 const int num=5;
    4 void func()
    5 {
    6     printf("fun in a.c");
    7 }

      这里main函数中引用了b.c中的函数func。因为所有的函数都是全局的,所以对函数的extern用法和对全局变量的修饰基本相同,需要注意的就是,需要指明返回值的类型和参数。

    转自《http://blog.csdn.net/xingjiarong/article/details/47656339

  • 相关阅读:
    优麒麟(UbuntuKylin)不是国产Linux操作系统
    Win10開始菜单打不开
    五步让你玩转CocoaPods
    设计模式学习笔记之适配器模式
    感谢各位亲们的大力支持,免费的HTML5学习课程《HTML5网页开发实例具体解释》连载已经结束了!
    iOS获取时间、日期
    leetcode NO.1 两数之和 (python3实现)
    leetcode NO.53 最大子序列和 (python3实现)
    [笔记]《算法图解》第六章 广度搜索优先
    [笔记]《算法图解》第四章 快速排序
  • 原文地址:https://www.cnblogs.com/codingmengmeng/p/7220119.html
Copyright © 2020-2023  润新知