【24】C++实战篇——【 C++ 外部变量】 C++多个文件共用一个枚举变量,外部变量 extern,枚举外部变量 enum

文章目录

  • [1 方法](#1 方法)
  • [2 外部变量 应用](#2 外部变量 应用)
    • [2.1 普通外部全局变量](#2.1 普通外部全局变量)
    • [2.2 枚举外部全局变量 应用](#2.2 枚举外部全局变量 应用)
      • [2.2.2 枚举外部变量优化](#2.2.2 枚举外部变量优化)

c++多个文件中如何共用一个全局变量

c++头文件的使用和多个文件中如何共用一个全局变量

C++共享枚举类型给QML

1 方法

①头文件中 声明外部全局变量

②在头文件对应的.cpp文件中定义该全局变量

③在要使用该外部变量的.cpp文件中,引用声明外部全局变量的.h文件;

明确几个点:

  • 1)不管变量还是函数先声明 或者直接定义才能使用,声明能声明n次,同一个作用域里面 定义只能定义一次

  • 2) 根据C++标准的规定,一个变量声明必须同时满足两个条件,否则就是定义:

    • (1)声明必须使用extern关键字;(2)不能给变量赋初值
csharp 复制代码
 extern  int  a;  //声明 
 int  a;   //定义
 int  a  =  0; //定义
 extern  int  a  =0;   //定义
  • 3)一个全局变量的作用域默认是整个程序, 加了static 或者加了 const 则是这个源文件

  • 4)如果在多个源文件 包含同一个名字的 全局变量的 定义,就会引起重定义

2 外部变量 应用

2.1 普通外部全局变量

  • (1)头文件中 声明外部全局变量

头文件:AutoROI.h

csharp 复制代码
//多文件全局变量
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

csharp 复制代码
//多文件全局变量
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文件;
csharp 复制代码
#include "AutoROI.h"

2.2 枚举外部全局变量 应用

  • (1)在头文件中 声明枚举类型

头文件:AutoROI.h

csharp 复制代码
//枚举类型声明
extern enum Cameras {
	cam1, cam2, cam3, cam4, cam5
};
extern enum ImgRegion {
	//选择区域
	B6, B4, B2, F6, F2,
};
  • (2)在头文件中 声明枚举变量

头文件:AutoROI.h

csharp 复制代码
//枚举变量声明
extern enum Cameras camera;
extern enum ImgRegion imgRegion;
  • (3)在.cpp中定义该全局变量

源文件:AutoROI.cpp

csharp 复制代码
//枚举定义变量
enum Cameras camera;
enum ImgRegion imgRegion;
  • (4)在任意要使用该外部变量的.cpp文件中,引用声明外部全局变量的.h文件;
csharp 复制代码
#include "AutoROI.h"

2.2.2 枚举外部变量优化

按照上面的步骤,运行后:

警告 C4091 "extern ": 没有声明变量时忽略"Cameras"的左侧

原因:

在头文件中 声明枚举类型时,加了extern;因为此时只是声明 枚举的类型,并没有声明枚举的变量,所以不需要 extern关键字;

于是 枚举类型声明 前的 extern,警告消失

总结:在使用枚举外部变量时;

枚举类型声明,无需加 extern关键字;
只有在声明枚举变量时,才加extern关键字;

记住, 不管是什么类型的外部变量,都只在变量前加extern关键字,至于变量类型啥的一律不加extern

相关推荐
Vesan,2 小时前
无人机开发分享——基于行为树的无人机集群机载自主决策算法框架搭建及开发
c++·算法·决策树·无人机
落羽的落羽3 小时前
【C++】哈希表原理与实现详解
数据结构·c++
快乐的划水a3 小时前
表驱动法-灵活编程范式
c++·链表
疯狂的Alex4 小时前
未来20年哪几种编程语言会保持优势?哪几种编程语言会得到更广泛的应用?
java·开发语言·c++·python·c#
爱吃生蚝的于勒4 小时前
一文学会c++继承 组合
java·c语言·开发语言·数据结构·c++·算法·蓝桥杯
愿天堂没有C++5 小时前
剑指offer第2版——面试题1:赋值运算符函数
c++·面试
程序猿编码8 小时前
二进制签名查找器(Aho-Corasick 自动机):设计思路与实现原理(C/C++代码实现)
c语言·c++·网络安全·二进制·逆向工程·ac自动机
R-G-B8 小时前
【35】C++实战篇—— string字符串与int、float数据合并成一个新的字符串
c++·string字符串与int·string字符串与float·string与int合并字符串·string与float合成串
weixin_3077791311 小时前
Redis Windows迁移方案与测试
c++·windows·redis·算法·系统架构