C语言中的头文件为什么不能定义变量

2023-05-16

1 前提

在实际项目中,会遇到这样的情况,在链接阶段,会提示定义在头文件中的变量,重定义,然后将将头文件中的变量定义成static类型,然后,不报错误了。

例如:

在a.h中有如下的定义:

#ifndef _A_H
#define _A_H

 unsigned char aData = 0;


#endif

在b.c源文件中,有对a.h包含,并使用了该变量

#include"a.h"

 void testFunB(void)
 {
     aData = 0;
 }

在c.c源文件中,也对a.h包含,并使用了该变量

#include"a.h"

 void testFunC(void)
 {
     aData = 1;
 }

然后在主函数中,对b.c,c.c中的两个函数调用。

 void main()
 {
     testFunB();
     testFunC();
 }

在链接的时候,就会出现啊a.c,和b.c中有对aData ,重定义。然后将aData 修改为static变量,后,会提示变量未定义,解决的办法,只有在其中的一个源文件中即a.c或b.c中定义该变量,然后在a.h文件中声明该变量,此时问题得到解决。

2 问题原因

出现上面的问题,主要有如下的几个原因。

2.1 static修饰后,变量就变成了内部变量,只在本文件有用。所以头文件中的变量只能在头文件中使用。

2.2 头文件定义非static类型的变量提示变量重定义,即使头文件中有 #ifndef _A_H 编译宏也不能起作用。原因是对C语言的编译原理没有理解到。

C语言在在编译分为几个过程,预处理,编译,汇编。预处理会将所有的宏展开,包含的头文件会展开到.c中。然后将.c编译成.o文件,最后将汇编会将所有.o文件链接成.hex.。所以 #ifndef _A_H并不能防止不同.c中去解决重定义问题,因为这个宏只在单个.c中起作用,就是例子程序在汇编之前都是没有问题的,但是此时在a.o和b.o中存在相同的一个变量,因此在链接的时候就会出现错误。

3 按照上面的分析,所以在头文件中定义变量或函数时候,需要特别的留意,也不是不可以。最好不要这样做。

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

C语言中的头文件为什么不能定义变量 的相关文章

随机推荐

  • jsoncpp与rapidjson易用性与性能评测

    文章目录 jsoncpp与rapidjson易用性与性能评测1 概述2 易用性2 1 jsoncpp2 2 rapidjson 3 性能4 总结 jsoncpp与rapidjson易用性与性能评测 1 概述 jsoncpp和rapidjso
  • 二叉树的构建、遍历及c++实现

    文章目录 二叉树遍历二叉树构建c 43 43 实现原码 二叉树遍历 二叉树有四种遍历方式 xff0c 先序遍历 中序遍历 后序遍历和层次遍历 xff0c 其中层次遍历类似于图结构里面的广度优先搜索BFS xff0c 先序遍历类似于深度优先搜
  • NodeJS开发web应用程序之http,express,socket.io介绍

    文章目录 NodeJS开发web应用程序之http xff0c express xff0c socket io介绍1 http2 express3 socket io NodeJS开发web应用程序之http xff0c express x
  • [编译问题解决]error: ‘atomic_int32_t’ in namespace ‘std’ does not name a type

    编译问题解决 error atomic int32 t in namespace std does not name a type https en cppreference com w cpp atomic atomic c 43 43
  • ffmpge转码常用指令介绍(不断更新...)

    帧率 分辨率 码率 文件大小转换 ffmpeg i input mp4 r 30 b a 100k b v 200k s 1920x1080 fs 4000K output mp4 i 输入视频文件 r 输出帧率 b a 输出音频码率 b
  • 解决linux系统下java调用带breakpad异常捕获的c++ sdk必现crash问题

    问题背景 java通过jni去集成c 43 43 sdk时线上发现会有偶现崩溃 xff0c 为了方便定位native c 43 43 的崩溃 xff0c sdk采用了google breakpad崩溃转储方案 xff08 Google跨平台
  • 基于netlink的Linux Network Monitor实现

    一 背景 来源于产品开发需求 xff0c 需要在linux系统下实现网络状类型查询及网络类型变更通知 xff0c 比如从Ethernet变为Wifi xff0c 从Wifi变为Ethernet等 二 设计方案 Linux系统提供了Netli
  • Altium Designer绘制一个stm32最小系统的电路原理图

    文章目录 一 Altium Designer二 新建工程文件三 绘制原理图库1 绘制元器件2 导入元器件库3 绘制模块 一 Altium Designer Altium Designer 是原Protel软件开发商Altium公司推出的一体
  • C++11面向切面编程(AOP)入门指南

    何为AOP 面向切面编程 xff08 AOP xff0c Aspect Oriented Programming xff09 是一种编程范式 xff0c 允许开发者在不修改原有代码的情况下 xff0c 为程序添加额外的功能 什么是面向切面编
  • 车道线识别/Opencv/传统方法

    车道检测 Advanced Lane Finding Project 实现步骤 使用提供的一组棋盘格图片计算相机校正矩阵 camera calibration matrix 和失真系数 distortion coefficients 校正图
  • 2019新买电脑必备软件

    都2019了 xff0c 怎么还要安装这些垃圾软件 xff01 群丫头买了个新电脑 xff0c 为了避免她踩到笔者曾今踩到的坑 xff0c 更舒心的使用电脑 xff0c 为此特写此文 作为一个电脑平凡使用者 xff0c 用过无数的软件 xf
  • Docker与anaconda+jupyter

    Arch docker的安装 pacman 安装docker sudo pacman S docker docker启动 sudo systemctl start docker 设置开机启动docker sudo systemctl ena
  • Opencv目标追踪

    参考 xff1a https www pyimagesearch com 2018 07 30 opencv object tracking 引言 Opencv作为图像处理开源库包含了Object Tracking目标追踪的一些API xf
  • 使用cmake编译,组织C++项目

    文章目录 前言例一例二例三 前言 这篇博客是我对cmake用法的一些经验总结 还很浅显 如果有错误或者更好的方案 欢迎指正 使用方法统一为在build目录中执行 cmake make 我觉得养成外部编译是一个好习惯 例一 目录结构为 lzj
  • Spring Security Oauth2.0认证授权

    基本概念 认证 用户认证就是判断一个用户的身份是否合法的过程 xff0c 用户去访问系统资源时系统要求验证用户的身份信息 xff0c 身份合法方可继续访问 xff0c 不合法则拒绝访问 常见的用户身份认证方式有 用户名密码登录 xff0c
  • C语言实现HTTP的GET和POST请求

    HTTP请求和IP TCP 所谓的HTTP协议是基于IP TCP协议的 xff0c 所以要获取远端的html数据只要创建socket对象就足够了 xff1b HTTP是基于IP TCP加上了网络请求的固定格式 get 请求 include
  • 英伟达GPU安装教程

    英伟达GPU安装教程
  • 四种插头类型:XH、VH、SM、HY

    PH1 25mm HY2 0mm XH2 5 2 54mm xff08 这两个其实是一样的 xff09 VH3 96mm 插头分成三种类型 xff1a XH xff1b VH xff1b SM xff1b HY XH 4Y 是插头 xff1
  • STM32F1C8T6Flash读取音频和DAC播放

    文章目录 一 Flash简介1 Flash原理2 STM32F1中的Flash 二 Flash地址空间的数据读取1 题目要求2 CUbeMX工程建立3 Keil工程修改4 STlink调试说明5 调试运行 三 基于片内Flash的提示音播放
  • C语言中的头文件为什么不能定义变量

    1 前提 在实际项目中 xff0c 会遇到这样的情况 xff0c 在链接阶段 xff0c 会提示定义在头文件中的变量 xff0c 重定义 xff0c 然后将将头文件中的变量定义成static类型 xff0c 然后 xff0c 不报错误了 例