问题的产生是来源在写一个项目时产生的问题

我起初先是采用多文件编程来完成某个项目,但是出现了每个内存中单独定义的问题

起初我没有认为是这个问题的原因在于是多文件重复包含了,理论上应该报变量重复定义,但是编译器并没报重复定义的问题。

当我把静态变量去除后,声明为普通的变量后就会报出重定义的问题

当我把头文件卫士加上后也是如此

这是我写的测试代码,复现了当时的情景:

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变量产生的问题相关推荐

  1. 头文件定义static变量

    记录一个问题: 在头文件test.h中定义了static变量如下: static char* str; 然后在a.cpp和b.cpp中都包含了test.h,并在这两个cpp中使用了str,然后发现,运 ...

  2. node.js关于一个js文件引用另一个js文件里面的函数或者数组变量

    node.js中跨文件的数据使用目前知道的有以下两种方式: 1.global变量 例:1.js 中有 function debug(){ console.log('debug'); } global. ...

  3. java读取mxl_Dom4j 读取一个XML文件和将String写成XML文件 | 学步园

    dom4j保存文件xml格式和读取XML文件内容,代码如下: package com.qmjs.imut import java.io.File; import java.io.FileWriter; ...

  4. 单片机C语言编程:.H文件与.C文件的关系!

    一个.C文件对应一个.H文件是一种良好的编程习惯,那么.C和.H文件之间的关系是怎么样的呢? 一..H文件与.C文件的关系: 迄今为止,写过的程序都是一些很简单的程序,从来没有想到要自己写.H文件,也 ...

  5. linux怎么查找文件名带有abc的文件,如何查找一个文件夹里的最新的文件

    如何查找一个文件夹里的最新的文件以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 如何查找一个文件夹里的最新的文件 安装一 ...

  6. java将多个文件写入到一个文件流中再有规律的取出_编写java程序,往一个txt文件里写入学生的基本信息,然后再读出这些信息并打印出来,最后把该文件拷贝到指...

    满意答案 azonyb 2014.02.18 采纳率:59%    等级:12 已帮助:13223人 import java.io.BufferedInputStream; import java.i ...

  7. Facebook图片存储系统Haystack——存小文件,本质上是将多个小文件合并为一个大文件来降低io次数,meta data里存偏移量...

    转自:http://yanyiwu.com/work/2015/01/04/Haystack.html 一篇14页的论文Facebook-Haystack, 看完之后我的印象里就四句话: 因为[传统文 ...

  8. php调用另一个php文件里的变量的值,thinkphp中一个方法调用另一个步骤的变量

    thinkphp中一个方法调用另一个方法的变量 //实例化上传类 public function upload() { $upload = new Upload(); $upload->maxS ...

  9. VB.net 移动文件夹去另一个地址,删除文件夹里某种类型的文件

    1. move one folder including inside files/folders to another path. 把一个文件夹及其里面的所有文件/文件夹移去另一个地址. e.g.把 ...

最新文章

  1. 浏览器缓存网站静态文件
  2. CF888G Xor-MST (01字典树+MST)
  3. 生成随机密码的十种方法
  4. OpenGL开发学习指南二(glfw+glad)
  5. 内存稳定性测试_内存条选择两条8G还是单条16G?通过对比浅谈该如何选择
  6. 前端技术分享:一个超级好用的CSS样式表
  7. win32bridge.server.exe函数不正确_修电脑?不,其实我们学的是......
  8. 机器学习算法总结--K均值算法
  9. autowired的对象为null_spring-为什么我的@Autowired对象为null?
  10. 关于Mybatis的几个问题
  11. mysql特效_Cocos2d-x学习笔记(16)(常见22种特效)
  12. linux cp覆盖每次都有提示
  13. 怎样做小游戏挖金子(VC,源码5)
  14. MDIO接口FPGA代码
  15. word目录中英文开头目录不对齐
  16. Groovy+Spock单元测试
  17. 矩阵分析:Kronecker积,Hadamard积
  18. LeetCode(中等)买卖股票的最佳时机含手续费(c#)
  19. 使用MQTTNet包实现客户端与服务端通讯
  20. 【HackTheBox】 meow

热门文章

  1. 阿里云服务器如何更换系统镜像
  2. linux服务器知识学习:了解Linux系统的启动过程
  3. 【无标题】排序算法(C语言)
  4. windows10 ubuntu16.04 双硬盘安装双系统安装
  5. pca各个向量之间的相关度_详细推导PCA算法
  6. java map 缓存数据_Map方式实现JAVA数据缓存
  7. 从linux使用sz命令下载大于4g的文件到windows
  8. 使用idea创建项目并通过git上传到码云
  9. Eclipse修改svn地址
  10. 不小心点了计算机一键还原怎么操作,电脑一键还原在哪里?电脑怎样一键还原系统...