一般用于:1、跨文件引用 2、全局变量
1、跨文件引用变量或者函数
// file1.cpp
int global_var = 100;
int add_numbers(int a, int b)
{return a + b;
}
// file2.cpp
extern int global_var;
extern int add_numbers(int a, int b);
int main()
{// 在这里可以使用在file1.cpp中定义的global_varstd::cout << global_var << std::endl;int result = add_numbers(3, 5);return 0;
}
注意,这种情况需要
add_executable(test src/file1.cpp src/file2.cpp)
才能保证变量可以跨文件引用,要不然编译器根本找不到变量global_var或者函数
2、全局变量
// header.h
extern int shared_variable;//声明
// source1.cpp
int shared_variable = 20;//定义——注意,所有与全局变量相关的文件中,只能定义一次全局变量。
// source2.cpp
#include "header.h"
int main()
{std::cout << shared_variable << std::endl;return 0;
}
常见错误1:test a[24] ‘test’ does not name a type
//test.hpp
#include<stdlib.h>
#include<iostream>
#include <cstdio>
#include<vector>
#include<iostream>
#include<stdlib.h>
#include<fstream>
#include<sstream>
using namespace std;namespace T
{test a[24];class test{public:test();void pf();void se(size_t t);int ddd = 0;};
}
//test.cpp
#include"test.hpp"
namespace T
{void test::pf(){std::cout<<"pf"<<std::endl;}void test::se(size_t t){std::cout<<"se"<<std::endl;}
}
int main(int argc, char** argv)
{T::test tt;tt.pf();return 0;
}
原因分析1:
由于命名test a[24]的时候,类的函数实现、定义、声明等都还没有出现,所以编译器在编译test a[24]的时候还不能确定test是一个合法的类。
//test.hpp
#include<stdlib.h>
#include<iostream>
#include <cstdio>
#include<vector>
#include<iostream>
#include<stdlib.h>
#include<fstream>
#include<sstream>
using namespace std;namespace T
{class test{public:test();void pf();void se(size_t t);int ddd = 0;};extern test a[24];//声明变量,这个变量的定义是在外部的。
}
//test.cpp
#include"test.hpp"
namespace T
{void test::pf(){std::cout<<"pf"<<std::endl;}void test::se(size_t t){std::cout<<"se"<<std::endl;}//这里,test类型已经完全定义了test a[24];//定义变量。这样编译器就能够确定类名的合法性。
}
int main(int argc, char** argv)
{T::test tt;tt.pf();return 0;
}