extern作用与用法

在C++中,extern关键字用于指定变量或函数的定义在其他的文件中。这样可以在多个文件之间共享变量或函数。主要用途是用于提供对全局变量和函数的访问,尤其是在大型项目中多文件共用的场景。

extern用法主要有以下几种场景:

  1. 声明全局变量而不定义它extern用来在一个文件中声明一个全局变量,而不是定义它。真正的定义会在别的地方。这样做的目的是为了在多个文件中共享这个变量。

    1
    2
    3
    4
    5
    // file1.cpp
    int myGlobal; // 定义一个全局变量

    // file2.cpp
    extern int myGlobal; // 声明相同的全局变量,告诉编译器其定义在其他地方

    以上代码中,file1.cpp定义了一个全局变量myGlobal,而file2.cpp使用extern来声明这个全局变量,以便可以在file2.cpp中访问file1.cpp中定义的myGlobal

  2. 声明函数: 一般情况下,函数在C++中默认是extern的,即使没有显式声明。但是你也可以显式地声明它,特别是在你想要强调函数可以在其他文件中被访问时。

    1
    2
    3
    4
    5
    // file1.cpp
    void doSomething(); // 默认extern

    // file2.cpp
    extern void doSomething(); // 显式声明
  3. static关键字的对比externstatic在用于变量声明时有着对立的含义。static用于限制变量或函数的链接作用域到定义它的文件,而extern则表明变量或函数可以在多个文件间共享。

  4. 使用extern "C"防止C++的名称修饰: 当你想要在C++代码中调用C语言编写的函数时,你需要防止C++编译器对这些函数名进行名称修饰(name mangling),因为C编译器不会这么做。extern "C"可以用来告诉C++编译器不要修饰这些特定的函数名。

    1
    2
    3
    extern "C" {
    #include "header_of_c_code.h"
    }

    或者用于单个函数声明:

    1
    extern "C" void cFunction();

在实际开发过程中,使用extern关键字可以帮助组织跨多个文件的代码,方便代码管理和模块化设计。但是,过度使用全局变量可能会引起程序设计上的问题,如数据封装不足、线程安全问题等,因此应当谨慎使用。