文章目錄
- 1 方法
- 2 外部變量 應用
- 2.1 普通外部全局變量
- 2.2 枚舉外部全局變量 應用
- 2.2.2 枚舉外部變量優化
c++多個文件中如何共用一個全局變量
c++頭文件的使用和多個文件中如何共用一個全局變量
C++共享枚舉類型給QML
1 方法
①頭文件中 聲明外部全局變量;
②在頭文件對應的.cpp文件中定義該全局變量;
③在要使用該外部變量的.cpp文件中,引用聲明外部全局變量的.h文件;
明確幾個點:
-
1)不管變量還是函數先聲明 或者直接定義才能使用,
聲明能聲明n次,同一個作用域里面 定義只能定義一次
; -
2) 根據C++標準的規定,一個變量聲明必須同時滿足兩個條件,否則就是定義:
- (1)
聲明必須使用extern關鍵字
;(2)不能給變量賦初值
- (1)
extern int a; //聲明 int a; //定義int a = 0; //定義extern int a =0; //定義
-
3)一個全局變量的作用域默認是整個程序, 加了static 或者加了 const 則是這個源文件
-
4)如果在多個源文件 包含同一個名字的 全局變量的 定義,就會引起重定義
2 外部變量 應用
2.1 普通外部全局變量
- (1)頭文件中 聲明外部全局變量
頭文件:AutoROI.h
//多文件全局變量
extern cv::Mat g_Img_SelectRegion; //選擇圖像區域,如B2,B3
extern cv::Mat g_Img_BorderROI; //H、V邊界ROI
extern cv::Mat g_Img_VertexROI; //屏幕四個頂點(左上、右上、左下、右下)"十字刻度尺"ROI//ROI-B2全局變量,邊線定位需要
extern int ROI_B2_X,ROI_B2_Y;
extern int ROI_Vexter_X ,ROI_Vexter_Y;//右上頂點
//ROI-H
extern int ROI_H_X,ROI_H_Y ;
//ROI-V
extern int ROI_V_X,ROI_V_Y ;
- (2)在.cpp中定義該全局變量
源文件:AutoROI.cpp
//多文件全局變量
cv::Mat g_Img_SelectRegion; //選擇圖像區域,如B2,B3
cv::Mat g_Img_BorderROI; //H、V邊界ROI
cv::Mat g_Img_VertexROI; //屏幕四個頂點(左上、右上、左下、右下)"十字刻度尺"ROI//ROI-B2全局變量,邊線定位需要
int ROI_B2_X,ROI_B2_Y;
int ROI_Vexter_X, ROI_Vexter_Y;//右上
//ROI-H
int ROI_H_X, ROI_H_Y;
//ROI-V
int ROI_V_X, ROI_V_Y;
- (3)在任意要使用該外部變量的.cpp文件中,引用聲明外部全局變量的.h文件;
#include "AutoROI.h"
2.2 枚舉外部全局變量 應用
- (1)在頭文件中 聲明枚舉類型
頭文件:AutoROI.h
//枚舉類型聲明
extern enum Cameras {cam1, cam2, cam3, cam4, cam5
};
extern enum ImgRegion {//選擇區域B6, B4, B2, F6, F2,
};
- (2)在頭文件中 聲明枚舉變量
頭文件:AutoROI.h
//枚舉變量聲明
extern enum Cameras camera;
extern enum ImgRegion imgRegion;
- (3)在.cpp中定義該全局變量
源文件:AutoROI.cpp
//枚舉定義變量
enum Cameras camera;
enum ImgRegion imgRegion;
- (4)在任意要使用該外部變量的.cpp文件中,引用聲明外部全局變量的.h文件;
#include "AutoROI.h"
2.2.2 枚舉外部變量優化
按照上面的步驟,運行后:
警告 C4091 “extern ”: 沒有聲明變量時忽略“Cameras”的左側
原因:
在頭文件中 聲明枚舉類型時,加了extern;因為此時只是聲明 枚舉的類型,并沒有聲明枚舉的變量,所以不需要 extern關鍵字;
于是 枚舉類型聲明 前的 extern,警告消失
總結:在使用枚舉外部變量時;
枚舉類型聲明,無需加 extern關鍵字;
只有在聲明枚舉變量時,才加extern關鍵字;
記住, 不管是什么類型的外部變量,都只在變量前加extern關鍵字,至于變量類型啥的一律不加extern