/ Programming

C/C++多个源文件共享函数与变量

在C/C++的实际项目中,我们常常会遇到一个项目中包含多个源文件,在编写代码的过程中,不可避免地要使用多个源文件中的变量(Variable)函数(Method)。那么,如何以正确的姿♂势来食用呢?

在一个项目的编译之前,先是预处理器对源文件进行处理,在这个过程中,实质上是将多个源文件合并为一段代码,引入*#include*,用实际值代替*#define*,并进行后续处理。

函数的使用

事实上,调用另一个源文件中定义的函数,相当于调用自身源文件中定义在后部的函数,需在函数使用前声明函数,或者在头文件中声明该函数。
例如:

源文件1:

//源文件test1.cpp
#include <iostream>
using namespace std;

int a();
int main(){
    cout << a() <<endl;
    system("pause");
    return EXIT_SUCCESS;
}

源文件2:

//源文件test2.cpp
int a(){
  return  666;
}

编译并运行,得到如下结果:
运行结果
在头文件中声明函数,也可以正常编译并运行~

变量的使用

归因于变量的存储类型与作用域,在另外的源文件中使用变量,比使用函数要复杂一些。

变量的存储类型(Storage class)是指存储变量的内存类型。变量的存储类型决定变量何时创建、何时销毁以及它的值将保持多久。有三个地方可以用于存储变量:普通内存、运行时堆栈、硬件寄存器。在这三个地方存储的变量具有不同的特性。

变量的默认存储类型取决于它的声明位置:

  • 在任何代码块之外声明的变量总存储在静态内存中,这类变量称为静态(Static)变量。静态变量在程序运行之前创建,在程序的整个执行期间始终存在,并且始终保持一定的值,你可以为它赋不同的值;
  • 在代码块内部声明的变量的默认存储类型是自动的(Automatic),即存储在堆栈中,称为自动(Auto)变量。在程序执行到自动变量的代码块时,该自动变量才被创建,当程序的执行流离开代码块时,该自动变量即被销毁。如果代码块被多次执行,则代码块中的自动变量被多次重新创建与销毁。对于在代码块内部声明的变量,如果加上关键词static,则可以将它的存储类型变为静态,但是修改变量的存储类型并不能修改该变量的作用域
  • 函数的形参不能声明为静态,因为实参总是在堆栈中传递给函数,用于支持递归。
  • register关键词可以用于声明储存于机器的硬件寄存器而非内存的自动变量,这类变量叫做寄存器变量。register的具体实现由编译器来表现,故不同的编译器对register有不同的理解。
  • 任何变量的作用域都不会超出本源文件。

因此,想要在源文件(test1.cpp)中使用其它源文件(test2.cpp)中的变量,我们首先需要在test2.cpp中声明一个extern修饰的变量,如下:

//test2.cpp
extern int a = 666;

然后我们需要在test1.cpp中同样定义一个extern修饰的相同名称的变量:

//test1.cpp
#include <iostream>
using namespace std;
extern int a;
int main(){
    cout << a <<endl;
    system("pause");
}

然后我们来看一下结果:
运行结果2

Reference:

  • Pointer on C
C/C++多个源文件共享函数与变量
Share this

Subscribe to Zed's Blog