c++定义全局变量详解

在C++中定义全局变量是应该尽量在.cpp文件中定义,而不要在.h 文件中 定义,定义好了之后,可以在.h文件中利用extern关键字进行声明。如果在.h文件中定义的话,多层包含可能会引起重复定义的错误。下面是一个示例:

在g_bash.cpp中定义全局变量:

// g_bash.cpp
#include "g_base.h"
int g_TicketCount = 0;  // 定义全局变量并初始化

在g_bash.h文件中利用extern关键字进行声明:

// g_bash.h
#ifndef G_BASE_H
#define G_BASE_H
extern int g_TicketCount;  // 全局变量声明
#endif // G_BASE_H

然后在其他文件要使用这些变量的时候,只要#include "g_base.h"就可以了,而且不会引起重复定义的错误。main.cpp下引用示例:

#include <QCoreApplication>
#include <iostream>
#include g_base.h
using namespace std;
void proc()
{
    cout<<  proc(): <<endl;
    g_TicketCount++;
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    cout<<  g_TicketCount =  << g_TicketCount << endl;
    proc();
    cout<<  g_TicketCount =  << g_TicketCount << endl;
    return a.exec();
}

结果:

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C/C++语言中全局变量重复定义问题的解决方法

    前言 在C语言中使用extern 关键字来定义全局变量的时候,我们需要在.h文件和.c文件中重复定义,这种重复,导致了出错几率的增加. 今天,在整理自己的代码的时候,考虑到我写的代码从一至终都是在一个cpp文件里面.于是,想把自己的代码中的各个模块分离开来,以便更好地阅读和管理. 遇到的问题 我的做法是: 宏定义.结构体定义.函数声明以及全局变量定义放到一个head.h头文件中 函数的定义放到head.cpp中 main函数放到main.cpp中 然而却报错了,提示xxx变量在*.obj文件中已

  • 一篇文章带你了解C++ static的作用,全局变量和局部变量的区别

    目录 1.static的作用 2.staic全局变量和局部变量的区别,存储位置? 区别: 我们自底向上的方式进行讲解: 总结 1.static的作用 (1) 修饰局部变量时,只初始化一次,延长了局部变量生命周期,直到程序结束才释放. (2)修饰全局变量,全局变量智能在本文件访问,不能在其他文件访问. (3)修饰函数同修饰全局变量类似,只能在本文件调用,不能在其他文件调用. (4)不想被释放的时候,可用static修饰. (5)考虑数据安全性,如当程序需使用全局变量时,应优先考虑static. 2

  • 基于C++全局变量的声明与定义的详解

    (1)编译单元(模块)在VC或VS上编写完代码,点击编译按钮准备生成exe文件时,编译器做了两步工作:第一步,将每个.cpp(.c)和相应的.h文件编译成obj文件:第二步,将工程中所有的obj文件进行LINK,生成最终.exe文件.那么,错误可能在两个地方产生:一个,编译时的错误,这个主要是语法错误:一个,链接时的错误,主要是重复定义变量等.编译单元指在编译阶段生成的每个obj文件.一个obj文件就是一个编译单元.一个.cpp(.c)和它相应的.h文件共同组成了一个编译单元.一个工程由很多编译

  • 解决C++全局变量只能初始化不能赋值的问题

    C++中,全局变量只能声明.初始化,而不能赋值 也就是说,下面这样是不被允许的: #include <cstdio> using namespace std; int a; a = 2; int main() { return 0; } 错误提示是: C++ requires a type specifier for all declarations 声明.初始化与赋值的区别: 声明:int a; 初始化:int a = 2;(在声明的时候顺带赋值叫做初始化) 赋值:a = 2; 只有定义(i

  • C++中的局部变量、全局变量、局部静态变量、全局静态变量的区别

    局部变量(Local variables)与 全局变量: 在子程序或代码块中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量. 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序或代码块. 当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用:在其它地方全局变量起作用. 全局变量在程序开始运行期间就已经在内存中开辟了内存空间,直到程序结束才会释放这块内存空间. 全局变量要在其他文件中使用,需显示的声明这个变量,使用extern关键字声明(extern int

  • c++定义全局变量详解

    在C++中定义全局变量是应该尽量在.cpp文件中定义,而不要在.h 文件中 定义,定义好了之后,可以在.h文件中利用extern关键字进行声明.如果在.h文件中定义的话,多层包含可能会引起重复定义的错误.下面是一个示例: 在g_bash.cpp中定义全局变量: // g_bash.cpp #include "g_base.h" int g_TicketCount = 0; // 定义全局变量并初始化 在g_bash.h文件中利用extern关键字进行声明: // g_bash.h #i

  • Python函数中的全局变量详解

    目录 1.什么是全局变量? 2.在函数外部定义的变量是全局变量. 3.在函数内部定义中添加global关键词后变成全局变量. 总结 1.什么是全局变量? 在Python中,全局变量指的是可以作用于函数内部和外部的变量. 在这里有两种情况:在函数的外部定义和内部定义添加global关键词变成全局变量. 2.在函数外部定义的变量是全局变量. 假设一个变量在函数的外部定义,那么这个函数就可以在函数的内部访问,也可以在函数的外部的访问. 示例:定义一个全局变量b,然后定义一个函数a,最后在该函数的内部和

  • go语言的变量定义示例详解

    目录 前言 定义单个变量 定义多个变量 定义相同类型的多个变量 变量的初始化 变量类型的省略 var关键字的省略(简短声明) 全局变量与局部变量 特别的变量名 未使用变量的限制 常量 前言 特别说明: 本文只适合新手学习 这篇文章带我们入门go语言的定义变量的方式,其实和javascript很相似,所以特意总结在此. 在go语言中,也有变量和常量两种,首先我们来看变量的定义,定义变量我们分为定义单个变量和多个变量. 本文知识点总结如下图所示: 定义单个变量 在定义单个变量中,我们通过var关键字

  • MyBatis Properties及别名定义实例详解

    上一篇我们介绍了mybatis的增删改查入门实例,我们发现在 mybatis-configuration.xml 的配置文件中,对数据库的配置都是硬编码在这个xml文件中,如下图,那么我们如何改进这个写法呢? 1.我们将 数据库的配置语句写在 db.properties 文件中 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm jdbc.username=root jdbc.password=ro

  • Spring Data JPA 简单查询--方法定义规则(详解)

    一.常用规则速查 1 And 并且 2 Or   或 3 Is,Equals 等于 4 Between   两者之间 5 LessThan 小于 6 LessThanEqual   小于等于 7 GreaterThan 大于 8 GreaterThanEqual   大于等于 9 After 之后(时间) > 10 Before 之前(时间) < 11 IsNull 等于Null 12 IsNotNull,NotNull 不等于Null 13 Like 模糊查询.查询件中需要自己加 % 14

  • 关于js二维数组和多维数组的定义声明(详解)

    声明一维数组:var goodsArr = []; 赋值:goodsArr[0] = 'First Value'; 这个毫无争议,因为平时使用PHP比较多,而php语法是可以直接使用goodsArr[0] = 'First Value'; 这种方法声明数组并赋值的,但js不能这样使用,必须先声明数组存在.同理,如果是二维和多维数组在使用前也必须声明二维和多维的数组,举例二维数组: var goodsArr[0] = []; 必须先这样声明一下二维数组才能使用二维数组,否则会出错的. 以上就是小编

  • C++中可以接受任意多个参数的函数定义方法(详解)

    能够接受任意多个参数的函数,可以利用重载来实现.这种函数的执行过程类似于递归调用,所以必须要有递归终止条件. #include <iostream> #include <bitset> void print() {} // 递归终止条件.这是必需的. template<typename Type, typename... Types> void print(const Type& arg, const Types&... args) { std::cou

  • 汇编基础教程段的定义应用详解

    目录 段 种类 代码段 数据段 DS和[address] 栈段 栈 操作方式 8086CPU提供入栈和出栈指令 栈顶超界的问题 push.pop指令 PUSH(入栈) POP(出栈) 栈段定义 思考 访问 段前缀 场景1 场景2 段 将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元 种类 代码段 定义 对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段. 可以将长度为 N( N≤64KB )的一组代码,存在一组地址连续.起始地址为 16的倍数的内存单元中,

  • 计算机程序设计并行计算概念及定义全面详解

    目录 1 摘要 2 概述 2.1 什么是并行计算? 2.2 为什么要并行计算? 2.3 谁都在使用并行计算? 科学界和工程界: 工业界和商业界: 全球应用: 3 概念和术语 3.1 冯诺依曼体系结构 3.2 弗林的经典分类 3.3 一些常见的并行计算术语 3.4 并行程序的缺陷和代价 复杂性: 可移植性: 资源需求: 可扩展性: 4 并行计算机的内存架构 4.1 共享内存 统一内存存取(Uniform Memory Access): 非统一内存存取(Non-Uniform Memory Acce

  • MyBatis  Properties及别名定义实例详解

    上一篇我们介绍了mybatis的增删改查入门实例,我们发现在 mybatis-configuration.xml 的配置文件中,对数据库的配置都是硬编码在这个xml文件中,如下图,那么我们如何改进这个写法呢? 1.我们将 数据库的配置语句写在 db.properties 文件中 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm jdbc.username=root jdbc.password=ro

随机推荐