引言

这些天写的程序中用到了全局变量,一开始是在一个文件下做测试后来把文件按逻辑拆分了一下,不同的代码被放在了几个文件中,最后用Makefile来编译就遇到了今天的话题,怎么在头文件中定义全局变量呢?

做法

要想一个文件中的变量被一个工程中的其他多个文件同时访问就要借助extern关键字,在头文件中用extern关键字声明该全局变量可供其他外部文件使用

  1. 在头文件中声明在C文件中定义
    其他文件要用到该变量时直接在C文件中用extern声明变量就可以了不用包含头文件
//如:parser.h中声明count、g_sigstop为全局变量
#ifndef PARSER_H
#define PARSER_Hextern int                              count;
extern int                              g_sigstop;char *parser_argument(int argc, char **argv);
void print_usage();
#endif

切记这里头文件中是声明不是定义,如果你要作死给count或者g_sigstop赋个值,比如:

extern int                              count=0;
extern int                              g_sigstop=0;

那问题就来了,只要包含这个头文件的C文件在编译的时候都会提示 count被多次定义这样的错误,因为include只是包含,会在预编译的时候把头文件的代码内容都copy到#include 头文件名了的C文件中来,所以最后包含了相应头文件的C文件都在编译时显示多次定义某个变量,在没有预编译之前头文件中负责声明,C文件中负责定义,通过预编译之后在C文件中既有变量的声明也有变量的定义,这样就可以直接使用变量了,把声明和定义放开在不同的地方这样方便了文件的移植和其它文件的引用

  1. 如果是多个C文件,只要有一个C文件定义过(初始化)该变量其他的C文件就不能再次定义了,需要调用这个变量直接在文件中声明就可以使用了
google@ubuntu1404:~/workspace/DLT$ cat dlt698_45.h
#ifndef  __DLT698_45_H
#define  __DLT698_45_Hextern int five;//在头文件中声明
#endif /* __DLT698_45_H */
google@ubuntu1404:~/workspace/DLT$
google@ubuntu1404:~/workspace/DLT$ cat dlt698_45.c
#include "dlt698_45.h"
#include <stdio.h>int five=7;//在C文件中定义
google@ubuntu1404:~/workspace/DLT$
google@ubuntu1404:~/workspace/DLT$ cat tes.c
#include <stdio.h>extern int five;//在其他C文件中使用时只需要声明
int main ()
{five++;printf("dlt698_45.h a is:%d\n",five);return 0;
}
google@ubuntu1404:~/workspace/DLT$
google@ubuntu1404:~/workspace/DLT$ cat makefile
VARABLE= tes.o  dlt698_45.o
test:$(VARABLE)gcc -o test $(VARABLE) -lcrypto -lssl
%.o:%.cgcc -c $< -o $@ #$<=所有c文件 $@=所有目标文件
.PHONY:clean
clean:rm -rf *.o a.out test ca.* server.crt server.csr server.key demoCA
google@ubuntu1404:~/workspace/DLT$ make
gcc -c tes.c -o tes.o
#tes.c=所有c文件 tes.o=所有目标文件
gcc -c dlt698_45.c -o dlt698_45.o
#dlt698_45.c=所有c文件 dlt698_45.o=所有目标文件
gcc -o test tes.o  dlt698_45.o  -lcrypto -lssl
google@ubuntu1404:~/workspace/DLT$ ./test
dlt698_45.h a is:8

参考博文:https://blog.csdn.net/lichen18848950451/article/details/65627345

头文件中定义全局变量相关推荐

  1. 能不能在头文件中定义全局变量?

    首先,这是一篇科普文,所以 比较杂,我尽量写清楚一些. 1.ANSI C标准是什么?GNU又是什么?ld是什么? ANSI C是C语言的标准规范,是国际标准化组织制定的国际标准. 虽然 ANSI C规 ...

  2. c语言头文件可以定义全局变量,C语言在头文件中定义全局变量

    C语言在头文件中定义全局变量 头文件定义全局变量等问题 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 可以,在不同的C文件中以static形式来声明同名全局变量.头文件中不可以直接定 ...

  3. C++头文件中定义全局变量在多次引用时出现变量多次定义符号冲突的解决办法...

    如果头文件多次被include 则全局变量的定义不能写在这个头文件中 建议写在一个Cpp文件中, 然后要用时,   加   extern   头,   再声明一下下就可以用了 如 在.Cpp中 int ...

  4. 能否用痰盂盛饭——谈谈在头文件中定义外部变量

    能否用痰盂盛饭--谈谈在头文件中定义外部变量 - garbageMan - 博客园 能否用痰盂盛饭--谈谈在头文件中定义外部变量 "能否用痰盂盛饭"并非是一个技术问题,而是一个哲学 ...

  5. c语言头文件中定义inline static相关函数的优劣

    头文件中常见static inline函数,于是思考有可能遇到的问题,如头文件经常会被包含会不会产生很多副本?网上说法不一.于是自己验证.经过arm-none-eabi-gcc下测试后得出结论. in ...

  6. 编写一个头文件,头文件中定义一个宏cube(x)用于求一个数的平方

    <程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p145 7.1.2 上级实训内容 [实现内容17]编写一个头文件,头文件中定义一个宏cube(x)用于 ...

  7. 【自我修养】不要嘻嘻哈哈的在头文件中定义变量

    在头文件中直接定义变量甚至定义加上赋值,是非常没有修养的行为,新手是经常这样干,有的老手也不注意,这是不应该的. 在头文件中定义变量会出现这些问题: 1,出现变量重复定义的错误.如果你在头文件中定义了 ...

  8. C++中头文件中定义的变量

    1.在头文件.h中定义static变量,如: static int x;其实就等效于每个引用该头文件的源文件中,定义一个变量名为x的整型静态全局变量,每个文件中的x变量均属于本源文件,各文件中的互不相 ...

  9. C语言如何使用其他文件定义的结构体?(C++报错:无法转换到不完整的类【需在头文件中定义结构体??】)

    文章目录 20210725 但是,我在使用的时候报错提示:无法转换到不完整的类?? 20210726 这样? 调用时直接加个extern就好,头文件管都不用管? 20210725 但是,我在使用的时候 ...

最新文章

  1. 汇编语言将数据、代码、栈放入不同段基础
  2. window 10 系统 部分软件打开图标的修改
  3. getElementsByTagName
  4. 剧本杀,继狼人杀之后的下一个风口
  5. python Requests登录GitHub
  6. 用c#编写爬虫在marinetraffic下载船仅仅图片
  7. LeetCode 441. 排列硬币(数学解方程)
  8. 系统架构师学习笔记-操作系统(三)
  9. 利用StringUtils可以避免空指针问题
  10. Java中如何去掉字符串中的非法字符(预防SQL注入)
  11. exchange服务器磁盘性能,如何解决Exchange磁盘空间问题
  12. Juniper 防火墙session拥堵案例解决
  13. python vue token_Haytham个人博客开发日志 -- Flask+Vue基于token的登录状态与路由管理...
  14. (HoneyView)轻便好用的免费图片浏览器
  15. 在.Net中进行SQL Server数据库备份与还原操作实用类
  16. 使用Maven下载jar包
  17. Qt QString to char*
  18. Thinkpad T61宽屏风扇拆缷与清理灰尘手记
  19. 如何在Mac电脑上调整日期和时间?如何高效管理时间?
  20. 最适合0基础入门的5种编程语言

热门文章

  1. 用matplotlib的Animation画动图
  2. 面试中被问到什么是前后端分离怎么回答
  3. VIM 命令及快捷键整理
  4. 构建ARM嵌入式开发环境
  5. java毕业设计青少年公共卫生教育平台源码+lw文档+mybatis+系统+mysql数据库+调试
  6. java毕业生设计缘梦书屋网站计算机源码+系统+mysql+调试部署+lw
  7. 计算机一级flash操作视频,WPS演示绝对快速实现Flash插入
  8. Docker 实战 - 局域网络搭建
  9. 海信手机android升级,海信HLTE200T海信F26卡刷升级包 全面屏版本
  10. Mac 安装maven时 mvn not found