【24】C++實戰篇——【 C++ 外部變量】 C++多個文件共用一個枚舉變量,外部變量 extern,枚舉外部變量 enum

文章目錄

  • 1 方法
  • 2 外部變量 應用
    • 2.1 普通外部全局變量
    • 2.2 枚舉外部全局變量 應用
      • 2.2.2 枚舉外部變量優化

c++多個文件中如何共用一個全局變量

c++頭文件的使用和多個文件中如何共用一個全局變量

C++共享枚舉類型給QML

1 方法

①頭文件中 聲明外部全局變量
②在頭文件對應的.cpp文件中定義該全局變量
③在要使用該外部變量的.cpp文件中,引用聲明外部全局變量的.h文件;

明確幾個點:

  • 1)不管變量還是函數先聲明 或者直接定義才能使用,聲明能聲明n次,同一個作用域里面 定義只能定義一次

  • 2) 根據C++標準的規定,一個變量聲明必須同時滿足兩個條件,否則就是定義:

    • (1)聲明必須使用extern關鍵字;(2)不能給變量賦初值
 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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917908.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917908.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917908.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux SELinux 核心概念與管理

Linux SELinux 核心概念與管理一、SELinux 基本概念 SELinux 即安全增強型 Linux(Security-Enhanced Linux),由美國國家安全局(NSA)開發,是一套基于強制訪問控制(MAC)的安全機制&…

Git 中**未暫存**和**未跟蹤**的區別:

文件狀態分類 Git 中的文件有以下幾種狀態: 工作區文件狀態: ├── 未跟蹤 (Untracked) ├── 已跟蹤 (Tracked)├── 未修改 (Unmodified) ├── 已修改未暫存 (Modified/Unstaged)└── 已暫存 (Staged)1. 未跟蹤 (Untracked) 定義:Gi…

前端1.0

目錄 一、 什么是前端 二、 HTML 1.0 概述 2.0 注釋 三、開發環境的搭建 1.0 插件 2.0 筆記 四、 常見標簽(重點) 四、案例展示(圖片代碼) 五、CSS引入 一、 什么是前端 web前端 用來直接給用戶呈現一個一個的網頁 …

Flutter鏡像替換

一、核心鏡像替換(針對 Maven 倉庫) Flutter 依賴的 Google Maven 倉庫(https://maven.google.com 或 https://dl.google.com/dl/android/maven2)可替換為國內鏡像,常見的有:阿里云鏡像(推薦&am…

MATLAB實現的改進遺傳算法用于有約束優化問題

基于MATLAB實現的改進遺傳算法(GA)用于有約束優化問題的代碼,包括處理非線性約束。此代碼通過引入懲罰函數和修復機制,有效處理約束條件,提高算法的魯棒性和收斂速度。 1. 定義優化問題 % 定義目標函數 function f ob…

Qt子類化QWidget后,使用setStyleSheet設置樣式無效的解決方案

關鍵代碼&#xff1a; #include <QPainter> #include <QStyleOption>void paintEvent(QPaintEvent *e) {QStyleOption opt;opt.init(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);QWidget::paintEvent(e); }定義…

【python中級】關于Flask服務在同一系統里如何只被運行一次

【python中級】關于Flask服務在同一系統里如何只被運行一次 1.背景 2.方案1 2.方案2 1.背景 python Flask實現的一個http服務,打包成應用程序exe后在windows10系統運行; 由于我會不斷的更新這個http服務,我希望運行這個http服務的時候之前的http服務被停掉; 即實現 Pytho…

git配置公鑰/密鑰

遇到 “gitgithub.com: Permission denied (publickey)” 錯誤通常意味著你嘗試通過 SSH 連接到 GitHub 時&#xff0c;SSH 密鑰沒有被正確設置或者 GitHub 無法識別你的公鑰。這里有幾個步驟可以幫助你解決這個問題&#xff1a; 檢查 SSH 密鑰 首先&#xff0c;確保你已經在本…

【機器學習】“回歸“算法模型的三個評估指標:MAE(衡量預測準確性)、MSE(放大大誤差)、R2(說明模型解釋能力)

文章目錄一、MAE、MSE、r概念說明二、MAE&#xff08;平均絕對誤差&#xff09;&#xff1a;用"房價預測"理解誤差測量三、MSE&#xff08;均方誤差&#xff09;&#xff1a;誤差的"放大鏡"1、概念說明2、 sklearn代碼實踐3、流程總結四、R&#xff1a;理解…

智慧城市SaaS平臺|市容環衛管理系統

【生活垃圾中轉設施監管】1) 設施信息管理a) 設施基本信息支持記錄中轉設施的名稱、位置、類型、容量、負責人等基本信息。b) 設施分布地圖支持通過GIS地圖展示中轉設施的分布情況&#xff0c;支持地圖查詢和導航。2) 垃圾收運監控a) 垃圾收運記錄支持記錄垃圾收運的時間、車輛…

JAVA-13常用類(2025.08.02學習記錄)

String類String類equals方法String類compareTo方法String類valueOf方法boolean參數內存分析_字符串拼接只會在內存中開辟一個對象內存分析_字符串new創建對象內存分析_變量和字符串拼接字節碼執行過程String類內存分析package com.cn;public class test01 {public static void …

QT----簡單的htttp服務器與客戶端

HTTP協議學習 協議的相關學習可以參考這篇 csdn學習連接 總體流程如下 HTTP服務器 監聽ip和端口,有連接時接收請求,發送回復 server.h #pragma once #include <QtWidgets/QMainWindow> #include "ui_httpServer.h" #include <QTcpServer> #include &l…

飛 算 JavaAI 解 析:有 了 它,麻 麻 再 也 不 用 擔 心 我 不 會 寫 代 碼 了!

聲 明&#xff1a;本 篇 博 客 為 測 評 體 驗 非 廣 告。 文 章 目 錄一、產 品 簡 介二、注 冊 與 上 手方 法 一 - - - 從 IDEA 插 件 市 場 安 裝方 法 二產 品 使 用三、產 品 體 驗智 能 引 導 功 能理 解 需 求設 計 接 口表 結 構 設 計處 理 邏 輯生 成 源 碼Java ch…

iOS混淆工具有哪些?在集成第三方 SDK 時的混淆策略與工具建議

許多 iOS 項目中&#xff0c;不可避免地會集成各種第三方 SDK&#xff0c;比如支付、統計、廣告、社交登錄等。這些 SDK 常常存在逆向被 Hook 或提取業務邏輯的風險&#xff0c;尤其是在流程敏感或要求合規的行業中。 當你無法對第三方源碼進行控制或重新編譯時&#xff0c;混淆…

【學習筆記之redis】刪除緩存

有一串這個代碼&#xff0c;staffEmailList這個key值里面的數據是錯誤的我需要刪除它&#xff0c;把數據新的數據加載到redis緩存中。 public EmailAddressRespDTO getAllEmailAddress() { List<EmailAddressRespDTO> staffEmailList redisCache.getCacheList("s…

Redis 持久化機制淺析

1. 持久化機制的作用 Redis 是基于內存的數據結構數據庫&#xff0c;雖然讀寫性能非常高&#xff0c;但所有數據默認保存在內存中。一旦服務器宕機、進程意外崩潰或容器重啟&#xff0c;內存中的數據將全部丟失。這對于生產環境的可用性與可靠性是極其危險的。因此&#xff0c;…

使用MatterJs物理2D引擎實現重力和鼠標交互等功能,有點擊事件(盒子堆疊效果)

使用MatterJs物理2D引擎實現重力和鼠標交互等功能&#xff0c;有點擊事件&#xff08;盒子堆疊效果&#xff09; 效果圖&#xff1a;直接上代碼&#xff0c;我是用的是html&#xff0c;使用了MatterJs的cdn&#xff0c;直接復制到html文件中然后在瀏覽器打開即可 <!DOCTYPE …

如何玩轉 Kubernetes K8S

在容器化時代&#xff0c;雖然Docker已經很強大了&#xff0c;但是在實際使用上還是有諸多不便&#xff0c;比如集群管理、資源調度、文件管理等等。 不過目前也涌現了很多解決方案&#xff0c;比如 Mesos、Swarm、Kubernetes 等等&#xff0c;其中谷歌開源的 Kubernetes就是其…

論文閱讀筆記:Dataset Condensation with Gradient Matching

論文閱讀筆記&#xff1a;Dataset Condensation with Gradient Matching1. 解決了什么問題&#xff1f;(Motivation)2. 關鍵方法與創新點 (Key Method & Innovation)2.1 核心思路的演進&#xff1a;從參數匹配到梯度匹配2.2 算法實現細節 (Implementation Details)3. 實驗結…

網安學習no.22

一、基礎系統信息命令&#xff08;簡單入門&#xff09;uname作用&#xff1a;查看系統內核信息示例&#xff1a;uname -a&#xff08;顯示完整內核版本、主機名、硬件架構等&#xff09;hostname作用&#xff1a;查看或設置主機名示例&#xff1a;hostname&#xff08;顯示當前…