一个多文件编程里.h文件定义static变量产生的问题
问题的产生是来源在写一个项目时产生的问题
我起初先是采用多文件编程来完成某个项目,但是出现了每个内存中单独定义的问题
起初我没有认为是这个问题的原因在于是多文件重复包含了,理论上应该报变量重复定义,但是编译器并没报重复定义的问题。
当我把静态变量去除后,声明为普通的变量后就会报出重定义的问题
当我把头文件卫士加上后也是如此
这是我写的测试代码,复现了当时的情景:
test.h
#ifndef GL
#define GL
static int test = 0;
extern void init(int *p);
extern int getTest();
#endif
test.c:
#include <stdio.h>
#include "test.h"void init(int *p){*p = 5;
}
int getTest(){return test;
}
main.c:
#include <stdio.h>
#include "test.h"int main(){init(&test);printf("%d\n",getTest());
}
简单Make:
all:gcc -c test.c -o testgcc main.c test
运行结果:
0
期望结果应该是5,因为我们在init里初始化了test
结果却是0
经过调试发现,main.c文件下的test和test.c文件下的test变量地址是不一样的
这确定了一个问题,那就是test.h下定义的静态变量,在被包含时被重复定义了,但是没有报重复定义的错误
即便我使用了头文件卫士也是如此
但是当我尝试使用VS编译器时,没有了这个问题
所以我修改了一下代码:
将.h文件下的static改成了普通的变量,声明为int test
extern int test;
然后在.c文件下定义出来
int test = 0;
注意.h使用extern时不要赋初值,不然编译器会认为你在定义变量,会出现重复定义
这样问题就解决了
我推测是编译器认为静态变量全局会存在一个,从而没有报重复定义的问题
而在底层变量又全都变成了地址,即便变量名相同,但是内存区不同,一样是可以使用的
所以这里建议大家不要在.h下定义任何变量,如果是全局的只使用extern声明出来,在.c下声明全局变量
一个多文件编程里.h文件定义static变量产生的问题相关推荐
- 头文件定义static变量
记录一个问题: 在头文件test.h中定义了static变量如下: static char* str; 然后在a.cpp和b.cpp中都包含了test.h,并在这两个cpp中使用了str,然后发现,运 ...
- node.js关于一个js文件引用另一个js文件里面的函数或者数组变量
node.js中跨文件的数据使用目前知道的有以下两种方式: 1.global变量 例:1.js 中有 function debug(){ console.log('debug'); } global. ...
- java读取mxl_Dom4j 读取一个XML文件和将String写成XML文件 | 学步园
dom4j保存文件xml格式和读取XML文件内容,代码如下: package com.qmjs.imut import java.io.File; import java.io.FileWriter; ...
- 单片机C语言编程:.H文件与.C文件的关系!
一个.C文件对应一个.H文件是一种良好的编程习惯,那么.C和.H文件之间的关系是怎么样的呢? 一..H文件与.C文件的关系: 迄今为止,写过的程序都是一些很简单的程序,从来没有想到要自己写.H文件,也 ...
- linux怎么查找文件名带有abc的文件,如何查找一个文件夹里的最新的文件
如何查找一个文件夹里的最新的文件以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 如何查找一个文件夹里的最新的文件 安装一 ...
- java将多个文件写入到一个文件流中再有规律的取出_编写java程序,往一个txt文件里写入学生的基本信息,然后再读出这些信息并打印出来,最后把该文件拷贝到指...
满意答案 azonyb 2014.02.18 采纳率:59% 等级:12 已帮助:13223人 import java.io.BufferedInputStream; import java.i ...
- Facebook图片存储系统Haystack——存小文件,本质上是将多个小文件合并为一个大文件来降低io次数,meta data里存偏移量...
转自:http://yanyiwu.com/work/2015/01/04/Haystack.html 一篇14页的论文Facebook-Haystack, 看完之后我的印象里就四句话: 因为[传统文 ...
- php调用另一个php文件里的变量的值,thinkphp中一个方法调用另一个步骤的变量
thinkphp中一个方法调用另一个方法的变量 //实例化上传类 public function upload() { $upload = new Upload(); $upload->maxS ...
- VB.net 移动文件夹去另一个地址,删除文件夹里某种类型的文件
1. move one folder including inside files/folders to another path. 把一个文件夹及其里面的所有文件/文件夹移去另一个地址. e.g.把 ...
最新文章
- 浏览器缓存网站静态文件
- CF888G Xor-MST (01字典树+MST)
- 生成随机密码的十种方法
- OpenGL开发学习指南二(glfw+glad)
- 内存稳定性测试_内存条选择两条8G还是单条16G?通过对比浅谈该如何选择
- 前端技术分享:一个超级好用的CSS样式表
- win32bridge.server.exe函数不正确_修电脑?不,其实我们学的是......
- 机器学习算法总结--K均值算法
- autowired的对象为null_spring-为什么我的@Autowired对象为null?
- 关于Mybatis的几个问题
- mysql特效_Cocos2d-x学习笔记(16)(常见22种特效)
- linux cp覆盖每次都有提示
- 怎样做小游戏挖金子(VC,源码5)
- MDIO接口FPGA代码
- word目录中英文开头目录不对齐
- Groovy+Spock单元测试
- 矩阵分析:Kronecker积,Hadamard积
- LeetCode(中等)买卖股票的最佳时机含手续费(c#)
- 使用MQTTNet包实现客户端与服务端通讯
- 【HackTheBox】 meow
热门文章
- 阿里云服务器如何更换系统镜像
- linux服务器知识学习:了解Linux系统的启动过程
- 【无标题】排序算法(C语言)
- windows10 ubuntu16.04 双硬盘安装双系统安装
- pca各个向量之间的相关度_详细推导PCA算法
- java map 缓存数据_Map方式实现JAVA数据缓存
- 从linux使用sz命令下载大于4g的文件到windows
- 使用idea创建项目并通过git上传到码云
- Eclipse修改svn地址
- 不小心点了计算机一键还原怎么操作,电脑一键还原在哪里?电脑怎样一键还原系统...