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. 可以在头文件中声明一个变量,在用的时候包含这个头文件就声明了这个变量。

上一篇:C中的extern和static


下一篇:VISUAL STUDIO 与 MATLAB实现混合编程