假设有这样一段程序:
#include <iostream>
using namespace std;
int a = 12; // 全局变量
void func(int x) {
cout << x + a << endl;
}
int main() {
int b = 10;
func(b);
}
现在希望将func
函数单独写为一个文件,并将a
定义为全局变量。
先展示一种错误的做法:
// globalVariable.h
#pragma once
int a = 12; // 声明并定义全局变量
void func(int x);
// func.cpp
#include <iostream>
#include "globalVariable.h"
using namespace std;
void func(int x) {
cout << x + a << endl;
}
// main.cpp
#include <iostream>
#include "globalVariable.h"
using namespace std;
int main() {
int b = 10;
func(b);
}
这样会出现编译错误,提示出现了重复定义:
编译报错:重复定义
出现错误的原因是:globalVariable.h中进行了全局变量的声明与定义(注意区分二者的区别),而func.cpp和main.cpp中都包含了globalVariable.h,即出现了重复定义。
那么我们只需要在globalVariable.h中利用extern
进行进行声明,而在func.cpp中进行定义即可。
完整的程序如下:
// globalVariable.h
#pragma once
extern int a; // 全局变量的声明,且要使用extern关键字
void func(int x);
// func.cpp
#include <iostream>
#include "globalVariable.h"
using namespace std;
int a = 12; //全局变量的定义
void func(int x) {
cout << x + a << endl;
}
// main.cpp
#include <iostream>
#include "globalVariable.h"
using namespace std;
int main() {
int b = 10;
func(b);
}
运行结果为22
。