zoukankan      html  css  js  c++  java
  • cpp: extern的作用

    转自:https://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html

    1.基本

    它是用来声明变量或者函数,说明在其他文件中被定义,那么链接时就在其他模块中寻找。

    用来说明“此变量/函数是在别处定义的,要在此处引用”。

    例子:

        (1) 在test1.h中有下列声明:
        #ifndef TEST1H
        #define TEST1H
        extern char g_str[]; // 声明全局变量g_str
        void fun1();
        #endif
        (2) 在test1.cpp中
        #include "test1.h"
            char g_str[] = "123456"; // 定义全局变量g_str
            void fun1() { cout << g_str << endl; }
        (3) 以上是test1模块, 它的编译和连接都可以通过,如果我们还有test2模块也想使用g_str,只需要在原文件中引用就可以了
        #include "test1.h"
    
         void fun2()    { cout << g_str << endl;    }

    这样的话g_str就是全局变量,一般这么来声明,而不能用static在头文件中声明+定义,那样会造成其他文件的污染。

    如果在头文件中直接声明而不加extern,那么多此包含head文件,就会产生重定义的错误。

    2.作用

    https://blog.csdn.net/big_bit/article/details/51595714

    在一个文件中定义了变量和函数, 在其他文件中要使用它们, 可以:

    1. 使用头文件,然后声明它们,然后其他文件去包含头文件
    2. 在其他文件中直接extern

    3.定义与声明

    1.定义也是声明,extern声明不是定义,即不分配存储空间。extern告诉编译器变量在其他地方定义了。

          extern int i; //声明,不是定义
    
           int i; //声明,也是定义

    2.如果声明有初始化式,就被当作定义,即使前面加了extern。只有当extern声明位于函数外部时,才可以被初始化。

    extern double pi=3.1416; //定义

    3.函数的声明和定义区别比较简单,带有{}的就是定义,否则就是声明。

          extern double max(double d1,double d2); //声明
    
           double max(double d1,double d2){}//定义

    4.除非有extern关键字,否则都是变量的定义

          extern int i; //声明
    
           int i; //定义

    4.总结

    1. 不要把变量定义放入.h文件,这样容易导致重复定义错误

    2. 尽量使用static关键字把变量定义限制于该源文件作用域,除非变量被设计成全局的。(static修饰的变量作用域就是当前文件)

    3. 可以在头文件中声明一个变量,在用的时候包含这个头文件就声明了这个变量。

  • 相关阅读:
    cookie的使用
    给定一个数组和一个目标值,找出和为目标值的整数,并返回他们的下标
    String详解
    阳哥讲面试题(四)生产调优
    springboot项目调优(针对特性的服务启动,定制化诉求)
    intern() 方法
    阳哥讲面试题(四)OOM,GC算法,垃圾收集器
    阳哥讲面试题(三)JVM,GC
    阳哥讲面试题(二)队列,线程池
    Semaphore用法
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/14193399.html
Copyright © 2011-2022 走看看