当前位置: 首页 > news >正文

C语言h文件可以定义变量吗,C语言h文件头中的变量初始化

很多时候,C程序员需要在文件头中初始化变量,如果没有好的宏定义方式,往往会导致多个文件引

用时,出现大量编译错误。以下C文件头定义方式,可以很好避免这些错误出现:

1.编写c_def.h文件头,内容为:

#undef  INIT_DEF_VAR

#undef  DEF_EX

#undef  DEF_EX_I

#define  DEF_EX           extern

#define  DEF_EX_I(x1)     extern  x1;

2.编写def_var.h文件头,内容为:

#undef      DEF_EX

#undef      DEF_EX_I

///

#define     DEF_EX

#define     DEF_EX_I(x1) x1

#define     INIT_DEF_VAR

3.编写用户文件头,例如eye.h

efdf463ef630b45f0a0e53709b4578be.png

4.编写另一个用户文件头,例如hd.h

#ifndef __HD_H__

#define __HD_H__

#include "c_def.h"

#ifdef  _NOW_DEF_VAR_HD

#include "def_var.h"

#endif

//

#include "eye.h"   //文件头相互嵌套,没有问题

/

DEF_EX int hdi1; //每一个变量前面添加DEF_EX

/

/

/

/

struct STDEMO

{

int x;

float y;

};

//以下为有初始化值的变量//如果需要初始化变量前面添加DEF_EX_I

DEF_EX_I(struct STDEMO stDemo1[])

#ifdef INIT_DEF_VAR

={

{33,3.4},

{27,9.7}

};

#endif

//

void prg2(void);

#endif

5. 编写C函数实体,例如eye.c

#define _NOW_DEF_VAR_EYE  //这个宏定义用于实例化在eye.h中定义的变量。书写格式为

_NOW_DEF_VER_加上文件头的名字EYE

#include"eye.h"

void prg1(void)

{

testi1=10;

testdat1[1]=20;

testint1=8;

}

6.编写另外一个C函数实体文件,例如hd.c

#define _NOW_DEF_VAR_HD//这个宏定义用于实例化在hd.h中定义的变量。书写格式为

_NOW_DEF_VER_加上文件头的名字HD

#include"eye.h"

#include"hd.h"

void prg2(void)

{

testi1=30;

testdat1[1]=15;

hdi1=10;

stDemo1[1].x=5;

}

6.编写主函数main.c

#include"eye.h"

#include"hd.h"

void Main(void)

{

prg1();

prg2();

testi1=12;

testdat1[1]=13;

}

7.编译。结果可以看到,不管文件头.h文件怎么嵌套引用,所有变量(包括初始化了的变量)都不

会出现错误或报警。

相关文章:

  • 幻方c语言编程,C语言程序编程:输入奇数输出n阶幻方矩阵.docx
  • 中国石油大学c语言上机题目答案,中国石油大学C语言上机题答案(2013版)答案_最全最详细...
  • 知道计算机c语言期末考试题库,大学计算机基础期末考试试题题库及答案.doc
  • 小度c1语言控制电视,小度在家1c怎么连接电视机
  • c语言数据类型陈述,麻烦,如果C语言中的陈述与计算相结合
  • android 广播震动,android的消息提示(震动与提示音)
  • android 动态创建线程池,Android四种常见的线程池
  • android包之间的关系,第 4 章 依赖关系,Android 库和多项目设置
  • android数组的定义数组长度,Android OpenGLES3.0 入门教程(三)——顶点数组和统一变量...
  • android mediastore.images.media.insertimage,尝试获取图像URI时,mediastore.images.media.insertImage返回空值...
  • android程序拍照内存溢出,彻底解决Android 拍照 内存溢出 Out of Memory的问题
  • 华为1120发布鸿蒙战略,华为发布智慧屏战略 首款产品搭载鸿蒙系统
  • Android备忘录github,Github备忘录
  • lua android异常捕获,使用lua实现try-catch异常捕获
  • 弹出自动消失html,用JS实现弹出div层过2秒自动消失的效果
  • 【Leetcode】104. 二叉树的最大深度
  • Angular6错误 Service: No provider for Renderer2
  • CentOS从零开始部署Nodejs项目
  • Swift 中的尾递归和蹦床
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 聊聊flink的TableFactory
  • 人脸识别最新开发经验demo
  • 设计模式 开闭原则
  • 深度学习中的信息论知识详解
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 微信小程序开发问题汇总
  • 再次简单明了总结flex布局,一看就懂...
  • 在weex里面使用chart图表
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • #define与typedef区别
  • #etcd#安装时出错
  • #vue3 实现前端下载excel文件模板功能
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (LeetCode C++)盛最多水的容器
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (补)B+树一些思想
  • (二)WCF的Binding模型
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (译)2019年前端性能优化清单 — 下篇
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)linux 命令大全
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .net 验证控件和javaScript的冲突问题
  • .Net6 Api Swagger配置
  • .NET多线程执行函数
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @Import注解详解
  • [\u4e00-\u9fa5] //匹配中文字符
  • [20150904]exp slow.txt
  • [ASP]青辰网络考试管理系统NES X3.5
  • [BZOJ1008][HNOI2008]越狱