C语言中关于全局变量的深入理解及使用方式

2023-05-16

以前觉得全局变量很简单,没有好好思考和理解,看到其他项目中的一些用法不太理解,最近正好有空,好好梳理了一下关于全局变量的定义和引用。

总的来说,有以下几种方式:

方式1:全局变量定义在源文件中,在需要引用该全局变量的其他源文件中进行声明即可
方式2:全局变量定义在源文件中,在其头文件中进行声明,其他需要引用该全局变量的源文件只需包括头文件即可
方式3:通过定义宏的方式根据条件决定是定义还是引用,通用性更强

具体如下,在常见的头文件#ifndef、#define、#endif之中,还加了一段,宏定义了#define ADCBSPEXT,从程序可以看出,当一个.c文件开头宏定义了ADCBSPEXT之后,ADCBSPEXT就为空,下面的变量就变成了定义;当.c文件当中没有宏定义ADCBSPEXT时,ADCBSPEXT就为extern,下面的变量就变成了申明。起到了双关的作用。

#ifndef DSP_ADC_BSP_H_    //防止头文件被重复包含
#define DSP_ADC_BSP_H_
 
#ifdef _DSP_ADC_BSP_C_   //判断是否被定义了
#define ADCBSPEXT         //定义时执行
#else
#define ADCBSPEXT extern //未定义时执行
#endif //_DSP_ADC_BSP_C_
ADCBSPEXT int a;
ADCBSPEXT void InitileAdc(void); 
ADCBSPEXT void CaptureAdcInt(); 
ADCBSPEXT unsigned char CaptureAdcInt_data();
 
#endif /* DSP_ADC_BSP_H_ */

使用上面这种形式的写法时,在头文件对应的源文件开头加上自己名称宏定义就可以了:

#define _DSP_ADC_BSP_C_ 
#include "xxx.h"

其他引用该全局变量的源文件不加。

BTW:源文件中采用#include "xxx.h"包含头文件,编译器在进行预处理时,要对#include命令进行“文件包含处理”:将xxx.c的全部内容复制到#include “xxx.h”处。所以上面的语句中宏定义#define _DSP_ADC_BSP_C_要放在#include "xxx.h"之前,这个是理解上面内容的关键。

另外延伸一下,对于函数的声明,前面一般不加extern,因为函数的声明和函数的定义(有实现)形式不一样,系统能够自动区分函数是声明还是定义,所以我们的函数声明系统默认就是extern,所以我们直接把函数原型放在头文件即可。

参考的文章链接如下:
1.C项目中变量、宏定义、结构体等声明定义位置问题(头文件、源文件)

2.c++怎么把头文件和源文件连起来_源文件与头文件关联

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言中关于全局变量的深入理解及使用方式 的相关文章

  • PyQt——QListView

    span class token comment coding utf 8 span span class token triple quoted string string 39 39 39 简介 PyQt5中 QListView 例子
  • PyQt——QListWidget

    span class token comment coding utf 8 span span class token triple quoted string string 39 39 39 简介 PyQt5中 QListWidget 例
  • PyQt——QTabWidget

    span class token comment coding utf 8 span span class token triple quoted string string 39 39 39 简介 PyQt5中 QTabWidget 例子
  • PyQt——QStackedWidget

    span class token comment coding utf 8 span span class token triple quoted string string 39 39 39 简介 PyQt5中 QStackedWidge
  • PyQt——QDockWidget

    span class token comment coding utf 8 span span class token triple quoted string string 39 39 39 简介 PyQt5中 QDockWidget 例
  • lingo入门教程之二 --- 集合运用

    lingo中的集合用法很多 xff0c 这里主要通过几个例题来进行讲解 对于每一个问题 xff0c 都要先找到对应的目标函数 xff0c 然后对相应值进行初始化 xff0c 然后找到约束条件等进行求解 例1 xff1a SAILCO公司需要
  • PyQt——MDI(多文档界面)

    span class token comment coding utf 8 span span class token triple quoted string string 39 39 39 简介 PyQt5中 QMdiArea 例子 3
  • PyQt——QScrollBar

    span class token comment coding utf 8 span span class token triple quoted string string 39 39 39 简介 PyQt5中 QScrollBar 例子
  • PyQt——QTimer

    span class token comment coding utf 8 span span class token triple quoted string string 39 39 39 简介 PyQT5中 QTimer例子 39 3
  • PyQt——QThread

    span class token comment coding utf 8 span span class token triple quoted string string 39 39 39 简介 PyQT5中 QThread 例子 39
  • PyQt——事件处理

    PyQt事件处理 前言1 低级的事件处理程序2 事件处理机制1 事件机制与信号槽机制的区别2 事件处理的方法3 事件处理实例 前言 1 低级的事件处理程序 span class token comment coding utf 8 span
  • python——精华技巧

    1 大量的if else结构采用字典key来匹配 days span class token operator 61 span span class token string 34 Mon Tue Wed Thu Fri Sat Sun 3
  • Python使用struct处理二进制(pack和unpack用法)

    python有时需要处理二进制数据 xff0c 例如 存取文件 xff0c socket操作时 这时候 xff0c 可以使用python的struct模块来完成 可以用struct来处理c语言中的结构体 一 struct模块中最重要的三个函
  • PyQt——QGroupBox

    QGroupBox为构建分组框提供了支持 分组框通常带有一个边框和一个标题栏 xff0c 作为容器部件来使用 xff0c 在其中可以布置各种窗口部件 布局时可用作一组控件的容器 xff0c 但是需要注意的是 xff0c 内部必须使用布局控件
  • PyQt——高清屏幕自适应设置

    Qt Designer 设计界面 xff1a 在高清屏未设置AA EnableHighDpiScaling的预览界面 xff1a 布局字体控件尺寸上明显存在偏差 设置了AA EnableHighDpiScaling的预览界面 xff1a 运
  • PyQt——实现多窗口

    主窗口通过按钮显示子窗口 1 使用qtdesigner设计窗口 主窗口 xff1a main window 子窗口 xff1a Dialog 生成的是ui文件 2 为两个窗口生成py文件 3 创建两个窗口的继承类 span class to
  • 《统计学习方法》各章节代码实现与课后习题参考解答

    待完成 统计学习方法 各章节代码实现与课后习题参考解答 章节代码课后习题第1章 统计学习方法概论 LeastSquaresMethod 传送门传送门 第2章 感知机 Perceptron 传送门传送门第3章 k近邻法 KNearestNei
  • Opencv的鼠标事件

    span class token keyword import span cv2 span class token keyword import span numpy span class token keyword as span np
  • python多线程之事件触发(线程间通信)

    span class token keyword import span threading event span class token operator 61 span threading span class token punctu

随机推荐

  • 架构规范

    系统架构规范 目录一 架构规范二 数据库规范三 SOA规范四 安全规范 目录 一 架构规范 所有的输入参数需要做合法性检验 xff1b 不允许出现空指针异常和数组越界异常 xff1b 不允许出现不受控制的大对象 xff0c 如没有限定大小的
  • 非主线程(GUI线程)中实现弹窗

    非主线程 xff08 GUI线程 xff09 中实现弹窗 目录一 在非主线程 xff08 GUI线程 xff09 中实现弹窗Step 1 创建界面文件 ui run loop dialog py Step 2 xff1a 代码主体 run
  • PyQT——多线程(QThread)

    PyQT线程 xff1a 多线程QThread 前言一 应用场景二 使用多线程解决卡顿和假死第一种 xff1a 线程锁 QMutex 第二种 xff1a 信号 Signal 前言 一 应用场景 在编写GUI界面中 xff0c 通常用会有一些
  • OpenCV-Python ——图像加文字

    Opencv 视频添加文字和标记框 前言一 OpenCV添加文字问题二 解决思路1 OpenCV图片转换为PIL图片格式2 使用PIL绘制文字3 PIL图片格式转换成OpenCV的图片格式 三 完整代码 前言 最近做了个视屏实时处理的需求
  • Django——工程搭建

    Django的工程搭建 目录 Django的工程搭建一 环境搭建1 创建虚拟环境2 安装Django3 虚拟环境和pip的命令 二 创建工程1 创建2 工程目录说明3 运行开发服务器 三 创建子应用1 创建2 子应用目录说明3 注册安装子应
  • Django——配置静态文件与路由

    静态文件与路由 一 配置文件1 BASE DIR2 DEBUG3 本地语言与时区 二 静态文件三 路由说明1 路由定义位置2 路由解析顺序3 路由命名与reverse反解析 xff08 逆向 xff09 3 1 路由命名3 2 revers
  • Django——请求与响应

    请求与响应 一 请求Request1 URL路径参数2 Django中的QueryDict对象3 查询字符串Query String4 请求体4 1 表单类型 Form Data4 2 非表单类型 Non Form Data 5 请求头6
  • 设计模式——单例模式/工厂模式

    设计模式 前言一 单例模式第 1 种 xff0c 重写 new 方法第 2 种 xff0c 闭包定义装饰器第 3 种 xff0c 多线程中构建单例 二 工厂模式1 简单工厂2 工厂方法3 抽象工厂 前言 常见的设计模式 xff0c 它们是
  • STM32 Futaba SBUS协议解析

    STM32 Futaba SBUS协议解析 1 S BUS1 1 协议介绍1 2 协议解析 2 硬件设计2 1 硬件参数2 2 反相电路 3 程序设计3 1 数据接收3 2 数据处理 4 最后 1 S BUS 1 1 协议介绍 S BUS是
  • Django——类视图

    类视图 前言1 类视图1 类视图引入2 类视图使用 2类视图原理3类视图使用装饰器3 1 在URL配置中装饰3 2 在类视图中装饰 4 类视图Mixin扩展类 前言 提示 xff1a 这里可以添加本文要记录的大概内容 xff1a 例如 xf
  • 设计模式——观察者模式

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 观察者模式 认识观察者模式观察者模式定义一 应用案例二 Python 实现总结 认识观察者模式 我们先看看报纸和杂志的订阅是怎么回事 xf
  • 面向对象设计原则

    面向对象设计原则是设计模式的基础 xff0c 每一个设计模式都符合某一个或者多个面向对象设计原则 xff0c 面向对象设计原则是用于评价一个设计模式的使用效果的重要指标之一 单一职责原则 一个对象应该只包含单一的职责 xff0c 并且该职责
  • 线程互斥锁 Lock

    线程互斥锁 Lock 前言Python 线程互斥锁1 创建互斥锁锁定资源 解锁资源 Python 线程死锁1 引入库 重点总结 前言 Python 线程互斥锁 1 创建互斥锁 span class token comment 导入线程thr
  • 多线程互斥锁Lock和RLock区别

    Python多线程互斥锁Lock和RLock区别 互斥锁Lock和RLock介绍互斥锁Lock互斥锁RLock区别 特殊情况 互斥锁Lock和RLock介绍 互斥锁Lock Lock被称为 原始锁 xff0c 原始锁是一个 在锁定时不属于特
  • 信号量semaphore

    python线程信号量semaphore 前言一 简介semaphore信号量相关函数semaphore信号量使用 前言 一 简介 多线程同时运行 xff0c 能提高程序的运行效率 xff0c 但是并非线程越多越好 xff0c 而semap
  • 线程事件 Event

    Python 线程事件 Event 前言一 介绍二 原理三 应用四 总结 前言 一 介绍 set 全局内置标志 Flag xff0c 将标志 Flag 设置为 True 通知在等待状态 wait 的线程恢复运行 isSet 获取标志 Fla
  • 线程定时器 Timer

    Python 线程定时器 Timer 原理 前言一 原理二 应用总结 前言 一 原理 指定时间间隔后启动线程 xff01 适用场景 xff1a 完成定时任务 xff0c 例如 xff1a 定时提醒 闹钟等等 span class token
  • 线程条件变量 Condition

    Python 线程条件变量 Condition 函数 前言 一 原理 二 应用 案例一 成语接龙 案例二 生产者与消费者模式 总结 前言 Python 互斥锁 Lock 主要作用是并行访问共享资源时 保护共享资源 防止出现脏数据 Pytho
  • Django——中间件

    Django中间件 前言1 中间件的定义方法2 执行流程3 多个中间件的执行顺序 前言 Django中的中间件是一个轻量级 底层的插件系统 xff0c 可以介入Django的请求和响应处理过程 xff0c 修改Django的输入或输出 中间
  • C语言中关于全局变量的深入理解及使用方式

    以前觉得全局变量很简单 xff0c 没有好好思考和理解 xff0c 看到其他项目中的一些用法不太理解 xff0c 最近正好有空 xff0c 好好梳理了一下关于全局变量的定义和引用 总的来说 xff0c 有以下几种方式 xff1a 方式1 x