c语言h文件定义变量,补习C语言之在.h文件中定义全局变量
话说在一次整理code的时候,无意间将一个原本定义在.c文件中的全局变量移动到.h 文件中(此全局变量被多个.c文件使用),然后突然不能生成.ko(linux中可动态装载的驱动模块).怎么回事?难道是移动code的时候弄错了?仔细一看提示信息,原来是 multiple definition.没整理之前的code是将此全局变量定义在file***.c 中, 然后在其他的.c中使用的是extern 导入,当时可以很顺利的编成.ko.后来由于感觉code不美观,在整理code的时候把它提到了file***.h中,让使用到这个全局变量的.c都 include file***.h(貌似这样做不是很好?暂时不管了).怎么就这么简单移动了一下code,就会出现问题?(有段时间没写 C code了,^_^...).
于是乎,开始写一个简单的测试code来找原因. 下面的几段估计全世界的会玩电脑的人都能看懂的code. 先贴上:
//file1.h
#ifndef __FILE1_H__
#define __FILE1_H__
int i;
#endif
//file2.h
#ifndef __FILE2_H__
#define __FILE2_H__
#include "file1.h"
extern void file2_change_i_value(void);
#endif
//file1.c
#include "file1.h"
#include "file2.h"
void main(void)
{
printf("before i = %d\n", i);
file2_change_i_value();
printf("after i = %d\n", i);
}
//file2.c
#include "file2.h"
void file2_change_i_value(void)
{
i = 10;
}
我使用的是linux平台,所以使用 gcc file1.c file2.c -o file 编译生成可执行文件file. 嗯??这次居然很顺利的生成了file.赶紧执行 ./file, console 打印出如下信息:
before i = 0
after i = 10
回头看看gcc 编译过程中有没有类似 multiple definition 的error 或 warning 信息,很遗憾,居然也没有.难道是现在写的这个小code没有模拟出上面生成.ko文件的原始code. 一想,还确实有点不一样的地方,于是乎,把上面的code修改为如下,只需要修改file1.h文件哦.
//file1.h
#ifndef __FILE1_H__
#define __FILE1_H__
int i = 0;
#endif
然后执行 gcc file1.c file2.c -o file , 哈哈,这次就出现 multiple definition of `i' 的提示了.
现在我们来比较一下2次 file1.h 的区别, 很显然, 第一次没有对 i 赋初值, 而第二次 赋初值为 0. 嗯? 好像int全局变量初始值都是0吧,想想,学习C语言到现在都第8个年头,书本的知识早也忘记得差不多了.言归正传,那既然全局变量 i 2次的的值都是一样的,为什么会出现这样的提示呢?哦,对了,好像有一次, 也是在一个.c文件中定义了一个全局变量并赋初值,然后直接把定义语句copy到了其他使用它的其他.c文件中,在前面加了一个 extern, 编译也是 failed. 这2 中现象是不是很相似??
看看C语言课本,自己的理解是,貌似在定义的时候可以赋初值,声明的时候不用赋值,只需要extern一下就OK.至于在.h中定义全局变量,大致也是说,这样做的话,多个.c文件在 include .h以后,会当作又重新定义变量,然后全局变量的命名污染了,就提示 multiple definition 了. 我个人觉得是这样,如有不够完整或有异义的地方大家可以留言指点.....
c语言h文件定义变量,补习C语言之在.h文件中定义全局变量相关推荐
- c语言头文件可以定义全局变量,C语言在头文件中定义全局变量
C语言在头文件中定义全局变量 头文件定义全局变量等问题 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 可以,在不同的C文件中以static形式来声明同名全局变量.头文件中不可以直接定 ...
- C++头文件中定义全局变量在多次引用时出现变量多次定义符号冲突的解决办法...
如果头文件多次被include 则全局变量的定义不能写在这个头文件中 建议写在一个Cpp文件中, 然后要用时, 加 extern 头, 再声明一下下就可以用了 如 在.Cpp中 int ...
- C语言全局变量(c文件和h文件中的全局变量、静态全局变量)使用注意事项
C语言在头文件中包含全局变量有三种形式: 1 在头文件中声明一个全局变量,在一个C文件中定义全局变量,然后在所有的引用了这个头文件的C文件里都可以使用该全局变量值. 如在main.c定义 int a ...
- 【自我修养】不要嘻嘻哈哈的在头文件中定义变量
在头文件中直接定义变量甚至定义加上赋值,是非常没有修养的行为,新手是经常这样干,有的老手也不注意,这是不应该的. 在头文件中定义变量会出现这些问题: 1,出现变量重复定义的错误.如果你在头文件中定义了 ...
- c语言中的全局变量类型,c++全局变量 C/C++中定义全局变量的几种方法及区别
c语言中全局变量主要是定义在所有函数之外的变量,在程序执行的过程中一直有效,可以被任何函数引用.赋值,想要定义它,一般将其定义在主函数main()之外就行. 例如下面的程序段,变量m就是一个全局变量, ...
- c语言头文件中定义inline static相关函数的优劣
头文件中常见static inline函数,于是思考有可能遇到的问题,如头文件经常会被包含会不会产生很多副本?网上说法不一.于是自己验证.经过arm-none-eabi-gcc下测试后得出结论. in ...
- 能否用痰盂盛饭——谈谈在头文件中定义外部变量
能否用痰盂盛饭--谈谈在头文件中定义外部变量 - garbageMan - 博客园 能否用痰盂盛饭--谈谈在头文件中定义外部变量 "能否用痰盂盛饭"并非是一个技术问题,而是一个哲学 ...
- C++中头文件中定义的变量
1.在头文件.h中定义static变量,如: static int x;其实就等效于每个引用该头文件的源文件中,定义一个变量名为x的整型静态全局变量,每个文件中的x变量均属于本源文件,各文件中的互不相 ...
- html引用c 变量,在jsp页面中定义全局变量,供其他页面引用
一.在一个jsp中引用另一个jsp的方法有: 1.使用 jsp include指令(常用): file属性是必填的(绝对或相对路径),但它不支持任何的表达式,也不允许通过?挂参方式来传递参数. 注意: ...
最新文章
- 看似简单但容易忽视的编程常识
- import导入工程时出现error:Description	Resource	Path	Location	Type Target runtime com.genuitec.runtime.gener
- Pytorch模型迁移和迁移学习,导入部分模型参数
- Linux 系统的硬链接和软链接详解
- 计算机网络之网络层:1、网络层功能、路由算法和路由选择概述
- html小球跳跃技术原理,HTML5在文本上跳跃的小球
- 客户端跳转与服务器跳转的区别
- AJAX(Asynchronous JavaScript And XML,异步JavaScript + XML)
- mysql5.7 gtid问题_MySQL 5.7.5: 新语法WAIT_FOR_EXECUTED_GTID_SET 及存在的问题-阿里云开发者社区...
- linux下安装Adobe Reader(acroread)
- Word VBA:批量更改图片的格式
- ffmpeg推流到流媒体服务器
- fpga驱动rgb液晶屏_[转载]基于FPGA的VGA驱动显示
- 1.8.9适用的java,Java 7、8、9+版本的一些新特性
- 树莓派用c语言pwm控制电机,树莓派学习笔记之PWM控制直流电机转速
- 仓库温控管理系统(一)系统概述
- 更改Mysql数据库密码
- 股票大数据分析软件V2.7
- Scratch实现正方形幻影效果
- 东北大学材料成型工艺学中挤压拉拔部分复习